进程锁意义:由于输出的屏幕对于进程来说是共享的,多进程在输出的时候可能造成输出乱序,因此需要进程锁来保证只有一个进程在输出到屏幕。
代码范例1:进程锁举例
from multiprocessing import Process, Lock def f(l, i): l.acquire() print('hello world', i) l.release() if __name__ == '__main__': lock = Lock() for num in range(10): Process(target=f, args=(lock, num)).start()
进程池:维护一个进程序列。实质是序列内的进程都已启动,但只有指定数量的进程可以同时被执行。(下例中同时有10个进程被启动,在并行的情况下只有5个进程同时执行)
进程池两种方法:
apply:串行
apply_async:并行
代码范例2:进程池
from multiprocessing import Process,Pool import time,os def Foo(i): time.sleep(2) print("from process: ",os.getpid()) return i+100 def Bar(arg): print("-->exec done: ", arg, os.getpid()) if __name__ == '__main__': pool = Pool(5) # 传入的参数为缺省processes=5 for i in range(10): # pool.apply(func=Foo,args=(i,)) # apply:串行 pool.apply_async(func=Foo,args=(i,),callback=Bar) # apply_async:并行,此程序是5个进程一起执行 # callback:回调函数,由父进程执行。用于需要程序回调信息时,如记录日志 print("end",os.getpid()) pool.close() pool.join() # 进程池中进程执行完毕后再关闭,如果注释此行则程序直接关闭。 # 注意最后两行的顺序,一定要先关闭进程池再join,不能颠倒
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
# 程序输出: end 6240 from process: 5988 -->exec done: 100 6240 from process: 7212 -->exec done: 101 6240 from process: 8016 -->exec done: 102 6240 from process: 6808 ... ...