目录
一、进程池
进程池 map() 和 imap() 方法的实现
代码演示:
import multiprocessing
def func(name):
print('start process {}'.format(name))
return name.upper()
if __name__ == '__main__':
p = multiprocessing.Pool(5) # 限制每次执行的进程数为 5 个进程
print(p.map(func,['map','map'])) # 开启一个进程
for i in p.imap(func,['imap','imap']): # 开启了 2 个进程
print(i) # 有两个参数就开启两个进程
运行结果:
进程池 apply_async() 的实现
代码演示:
#!/usr/bin/env python
import multiprocessing
import time
def func(name,plan):
print('start process {} 计划'.format(plan))
time.sleep(2)
return name.upper()
if __name__ == '__main__':
results = []
p = multiprocessing.Pool(5) # 限制运行的进程数量为 5 个
for i in range(7): # 开启 7 个进程,而 7 个进程超过了 5 个,所以限制了 2 个进程,不给放行
res = p.apply_async(func, args=('诸葛亮','B'))
results.append(res)
for i in results:
print(i.get(2.1)) # 限制获取进程返回值的超时时间为 2.1 秒
运行结果:
一次只有 5 个进程在运行,另外 2 个进程,不允许运行。
这里使用列表来存储队列 Queue
对象,应该是提前用了 Queue 模块的 put()
方法,然后返回一个队列对象。
二、简单 Process 方法
代码演示:
#!/usr/bin/env python
from multiprocessing import Process
import os
import time
def func(name):
print('start a process {}'.format(name))
time.sleep(3)
print('the process parent id :',os.getppid())
print('the process id is :',os.getpid())
if __name__ =='__main__':
processes = []
for i in range(2):
p = Process(target=func,args=(i,))
processes.append(p)
for i in processes:
i.start()
print('start all process')
for i in processes:
i.join()
#pass
print('all sub process is done!')
运行结果
python 多线程不是无法找到 id,而是因为多线程是数据共享的,所以所有的多线程都是共享一个共享 id
参考链接:
获得进程id_浅谈python中的多线程和多进程(二)
Tips:
三、进程堵塞 join 理解
在这里进程堵塞,是由系统将在工作队列内的主进程安排进了等待队列内,导致只执行在工作队列内的子进程,而不执行主进程,从而形成了一个主进程堵塞的现象。
相关引用如下所示:
参考链接:
终于想明白操作系统的中断和进程阻塞了
四、进程的 sleep() 线程睡眠理解
sleep()
针对的是线程,又因为每一个进程都有一个主线程,所以即使是在主进程创建子进程后,在子进程的执行函数内,sleep()
线程睡眠仍旧是对子进程起作用,因为sleep()
线程睡眠针对的是子进程的主线程。