python3多进程 进程池 协程并发
一、进程
我们电脑的应用程序,都是进程,进程是资源分配的单位。进程切换需要的资源最大,效率低。
进程之间相互独立
cpu密集的时候适合用多进程
#多进程并发
import multiprocessing from multiprocessing import Pool import time def test1(): for i in range(10): time.sleep(1) print('test', i) def test2(): for i in range(10): time.sleep(1) print('test', i) if __name__ == '__main__': p1 = multiprocessing.Process(target=test1) p2 = multiprocessing.Process(target=test2) p1.start() p2.start()
#进程之间不共享
import multiprocessing from multiprocessing import Pool import time import threading g_num = 0 def test1(): global g_num for i in range(10): g_num += 1 def test2(): print(g_num) if __name__ == '__main__': p1 = multiprocessing.Process(target=test1) p2 = multiprocessing.Process(target=test2) p1.start() p1.join() p2.start()
结果是 0
二、进程池
python中,进程池内部会维护一个进程序列,当需要时,程序会去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用的进程为止。
#进程池实现并发
import multiprocessing from multiprocessing import Pool import time import threading g_num = 0 def test1(): for i in range(10): time.sleep(1) print('test1',i) def test2(): for i in range(10): time.sleep(1) print('test2',i) if __name__ == '__main__': pool = Pool(2) # 允许进程池里同时放入2个进程 其他多余的进程处于挂起状态 pool.apply_async(test1) pool.apply_async(test2) pool.close() # close() 必须在join()前被调用 pool.join() # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
join() 方法实现进程间的同步,等待所有进程退出。 close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。 apply_async()本身就可以返回被进程调用的函 数的返回值
三、 协程:
协程相对独立,有自己的上下文,但其切换由自己控制,由当前协程切换到其他协程由协程来控制。而线程的切换由系统控制。 协程切换需要的资源很小,效率高
多进程、多线程根据cpu核数不一样可能是并行的,但是协程在一个线程中
#协程,自动切换(可以在test2sleep的时候切换去执行test1)
import gevent,time from gevent import monkey monkey.patch_all() #gevent三行放在其他所有import语句之前可以避免出现警告或者报错信息,导致程序不能正常运行 def test1(): for i in range(10): time.sleep(1) print('test1',1) def test2(): for i in range(10): time.sleep(2) print('test2',2) g1 = gevent.spawn(test1) g2 = gevent.spawn(test2) g1.join() g2.join()