python——>3.8
windows
多进程的使用在python中是必要的,原因在于python的解释器。python的解释器是GIL
,全称是global interpreter lock
-- 全局解释器锁。CPython解释器所采用的一种机制,它确保同一时刻只有一个线程在执行 Python代码。所以为了避免这种影响,通常我们可以创建多进程,用子进程来代替线程。
class multiprocessing.Process
(group=None, target=None, name=None, args=(), kwargs={}, ***, daemon=None)
那么上述是构造类的各个参数的详情,构造之后我们还需要知道运行实例的一些方法
直接使用Process
类创建子进程
from multiprocessing import Process
import os
def demo():
print(‘Parent Process ID: %d‘ %(os.getppid()))
print(‘Process ID: %d‘ %(os.getpid()))
if __name__ == ‘__main__‘:
p = Process(target=demo)
p.start()
p.join()
运行结果:
>python 1.py
Parent Process ID: 8428
Process ID: 5500
进程池,这个主要是当需要的进程数量很多的时候采用到进程池来限制进程数量,从而不需要我们再去敲代码来限制进程的数量,当进程少时,我们直接用Process
就可以了
class multiprocessing.pool.Pool
([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
None
,意味着工作进程和进程池Pool生命周期相同。multiprocessing.Pool()
或者一个上下文对象的 Pool()
方法创建的。在这两种情况下, context 都是适当设置的。terminate()
join()
前必须先调用 close()
或者 terminate()
map()
的延迟使用版本,如果 chunksize 是 1
, 那么 imap()
方法所返回的迭代器的 next()
方法拥有一个可选的 timeout 参数: 如果无法在 timeout 秒内执行得到结果,则next(timeout)
会抛出 multiprocessing.TimeoutError
异常。from multiprocessing import Pool
def demo(flag):
print(‘www.jlx-love.com flag %d‘ %flag)
if __name__=="__main__":
flag = [1, 2, 3, 4, 5, 6, 7, 8, 9]
pool = Pool(processes=3)
pool.map(demo, flag)
pool.close()
pool.join()
运行结果:
>python 1.py
www.jlx-love.com flag 1
www.jlx-love.com flag 2
www.jlx-love.com flag 3
www.jlx-love.com flag 4
www.jlx-love.com flag 5
www.jlx-love.com flag 6
www.jlx-love.com flag 7
www.jlx-love.com flag 8
www.jlx-love.com flag 9
这里我设置进程池最大进程数是3,当然也可以设置成别的,然后我们采用map()
方法传递可迭代对象,记住,对象必须是可迭代的。然后关闭进程池任务,调用完close()
停止进程池继续接收任务后再调用join()
等待工作进程结束
from multiprocessing import Pool
import time
def demo(flag):
print(‘www.jlx-love.com flag %d‘ %flag)
if __name__=="__main__":
start = time.time()
pool = Pool(processes=5)
for flag in range(50):
pool.apply(demo, args=(flag, ))
print(‘I am a flag‘)
pool.close()
pool.join()
end = time.time()
print(‘用时:%f‘ %(end - start))
运行结果:
www.jlx-love.com flag 0
.
.
.
.
www.jlx-love.com flag 47
www.jlx-love.com flag 48
www.jlx-love.com flag 49
I am a flag
用时:0.339805
from multiprocessing import Pool
import time
def demo(flag):
print(‘www.jlx-love.com flag %d‘ %flag)
if __name__=="__main__":
start = time.time()
pool = Pool(processes=5)
for flag in range(50):
pool.apply_async(demo, args=(flag, ))
print(‘I am a flag‘)
pool.close()
pool.join()
end = time.time()
print(‘用时:%f‘ %(end - start))
运行结果:
I am a flag
www.jlx-love.com flag 0
.
.
.
.
www.jlx-love.com flag 48
www.jlx-love.com flag 49
用时:0.342791
不知道你有没有发现上面两个方法结果的不同?就是输出I am a flag
位置不同,apply()
是等进程池中的子进程全部完成后才输出内容,而apply_async()
则是当执行完for循环步骤后即输出内容,所以我们看到了输出内容的位置不同之处。所以有此结论:
apply()---------------------->同步(阻塞)
apply_async()---------------->异步(非阻塞)
原文:https://www.cnblogs.com/Jleixin/p/14300052.html