1.通过multiprocessing.Process()类创建子进程
1 import multiprocessing, time, os, random
2
3
4 def work(index):
5 """
6 任务
7 :param index:任务索引号
8 """
9 start_time = time.time() # 取当前时间,以毫秒为单位,从1979年一月一号算起
10 # random.random() :random() -> x in the interval [0, 1)
11 time.sleep(random.random())
12 stop_time = time.time()
13 print("任务%d 执行时间%.2f 当前进程id = %d 当前进程的父进程为id= %d" % (index, stop_time - start_time, os.getpid(), os.getppid()))
14
15
16 if __name__ == '__main__':
17 print("main - 当前进程id = %d" % os.getpid())
18 # 创建子进程方式1 通过multiprocessing.Process()类创建
19 for i in range(10):
20 p = multiprocessing.Process(target=work, args=(i,))
21 p.start()
结果如下: 可以看出完成10个任务创建了10个子进程,且这些子进程由主进程创建
2.使用进程池创建子进程
"""
进程池
1. multiprocessing.Pool()
2. apply_async(func[,args[,kwds]])
申请异步执行任务
- func:指向子进程要执行的函数
- args:向func指向的函数传递可变参数
- kwargs:向func指向的函数传递关键字参数
3. close() : 关闭进程池, 不再接收新的任务请求
4. terminate() :终止进程池中的子进程的任务执行
5. join(): 阻塞主进程,直到进程池中的所有子进程执行完毕,再解阻塞,必须在close或terminate之后使用;
"""
import multiprocessing, time, os, random
def work(index):
"""
任务
:param index:任务索引号
"""
start_time = time.time() # 取当前时间,以毫秒为单位,从1979年一月一号算起
# random.random() :random() -> x in the interval [0, 1)
time.sleep(random.random())
stop_time = time.time()
print("任务%d 执行时间%.2f 当前进程id = %d 当前进程的父进程为id= %d" % (index, stop_time - start_time, os.getpid(), os.getppid()))
if __name__ == '__main__':
print("main - 当前进程id = %d" % os.getpid())
# 创建进程池
"""通过进程池来创建子进程,再执行任务
processes=3: 设置进程池最大值(拥有进程最大数量)
缺省值: os.cpu_count() or 1 , 即cpu的数量作为进程池的最大值
"""
pool = multiprocessing.Pool(3)
for i in range(10):
pool.apply_async(func=work, args=(i,))
结果如下: 可以看出,完成10个任务,总共还是3个子进程,且这3个子进程也是有主进程创建
如果你和我有共同爱好,我们可以加个好友一起交流!