单核CPU多任务实现的原理,是由操作系统中的调度算法:
- 时间片轮转
- 优先级调度
并发:看着像一起执行
多核才有并行
fork()创建新进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import os ret = os.fork() print(ret) if ret>0: print("---父进程--%d-"%os.getpid()) else: print("---子进程---%d-%d-"%(os.getpid(),os.getppid())) print("----over---")
|
多次fork的进程数 = 2的^fork次数的增长,所以要防止fork炸弹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import os import time ret = os.fork() if ret==0: print("--1--") else: print("--2--") ret = os.fork() if ret==0: print("--11--") else: print("--22--")
|
跨平台创建进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from multiprocessing import Process import time def test(): for _ in range(5): print("---test---") time.sleep(1) if __name__ == '__main__': p = Process(target=test) p.start() p.join(1) for _ in range(3): print("---main---") time.sleep(1)
|
进程池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| from multiprocessing import Pool import os import time def worker(num): for i in range(2): print("===pid=%d==num=%d="%(os.getpid(), num)) time.sleep(1) if __name__ == '__main__': pool = Pool(3) for i in range(5): print("---%d---"%i) pool.apply_async(worker, (i,)) pool.close() pool.join()
|
进程间通信Queue(队列:先进先出)
想要完成进程间的数据共享,需要一些方法:命名管道(pipe)/信号(sign)/无名管道/共享内存/消息队列(缓存)/网络(socket)等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import os from multiprocessing import Manager,Pool def writer(q): print("writer启动(%s),⽗进程为(%s)"%(os.getpid(),os.getppid())) for i in "dongGe": q.put(i) def reader(q): print("reader启动(%s),⽗进程为(%s)"%(os.getpid(),os.getppid())) for i in range(q.qsize()): print("reader从Queue获取到消息:%s"%q.get(True)) if __name__=="__main__": print("(%s) start"%os.getpid()) q=Manager().Queue() po=Pool() po.apply(writer, (q,)) po.apply(reader, (q,)) po.close() po.join() print("(%s) End" % os.getpid())
|