暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python多进程

歪歪梯Club 2020-07-21
156

Python的线程因为解释器锁的设计,所以不能充分利用CPU,只能通过进程来实现多核利用 性能考虑的话,底层还是不要用Py,进程切换效率太低,Py多做为脚本层的胶水语言

fork子进程

如果是linux上,可以使用linux的fork函数创建子进程 在python里通过os模块调用linux的fork,可以直接生成一个与当前进程执行完fork语句后的状态一致的拷贝子进程

  1. import os

  2. pid = os.fork()

  3. if pid==0:

  4. #0代表没有子进程,所以是子进程

  5. print 'son'

  6. else:

  7. #父进程

  8. print 'father'

创建独立子进程

windows下没有fork,但是multiprocessing模块的Process类提供了一个跨平台的多线程实现——通过传入方法对象和方法参数,构造进程对象,提供类似线程的start等方法

  1. from multiprocessing import Process


  2. def show(x):

  3. print(x)

  4. #如果是在windows下,需要使用下面判断,确保解释器完成了主进程创建引导后再创建子进程

  5. if __name__=='__main__':

  6. #创建线程必须在

  7. p = Process(target=show,args=('YYT',))

  8. p.start()

  9. #join保证等到p进程执行结束才继续往下执行(避免主进程结束,子进程被关闭)

  10. p.join()

使用进程池

multiprocessing模块的Pool类提供创建进程池

  1. from multiprocessing import Pool

  2. import time, random


  3. def show(i):

  4. time.sleep(random.random() * 3)

  5. print(i)


  6. if __name__=='__main__':


  7. p = Pool()

  8. for i in range(5):

  9. p.apply_async(show, args=(i,))

  10. time.sleep(5)

  11. print("apply done...")

  12. p.close()

  13. #进程池close了才能使用join

  14. p.join()

  15. #join会阻塞到进程池全部进程执行完

  16. print("All done.")

进程间通信

multiprocessing模块的Queue类,提供进程安全的阻塞队列

  1. from multiprocessing import Process, Queue

  2. import time, random


  3. def PutQueue(q):

  4. time.sleep(random.random())

  5. q.put('yyt')

  6. def GetQueue(q):

  7. while True:

  8. value = q.get()

  9. print ('Get %s.' % value)


  10. if __name__=='__main__':

  11. q = Queue()

  12. pq = Process(target=PutQueue, args=(q,))

  13. gq = Process(target=GetQueue, args=(q,))

  14. gq.start()

  15. pq.start()

  16. pq.join()

  17. #强行终止GetQueue

  18. gq.terminate()


文章转载自歪歪梯Club,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论