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_numfor 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()
转载于:https://www.cnblogs.com/heiguu/p/10056798.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
