前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多进程

Python多进程

作者头像
歪歪梯
发布2020-07-22 15:25:43
6200
发布2020-07-22 15:25:43
举报
文章被收录于专栏:歪歪梯Club歪歪梯Club

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

fork子进程

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

代码语言:javascript
复制
import ospid = os.fork()if pid==0:    #0代表没有子进程,所以是子进程    print 'son'else:    #父进程    print 'father'

创建独立子进程

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

代码语言:javascript
复制
from multiprocessing import Process
def show(x):    print(x)#如果是在windows下,需要使用下面判断,确保解释器完成了主进程创建引导后再创建子进程if __name__=='__main__':    #创建线程必须在    p = Process(target=show,args=('YYT',))    p.start()    #join保证等到p进程执行结束才继续往下执行(避免主进程结束,子进程被关闭)    p.join()

使用进程池

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

代码语言:javascript
复制
from multiprocessing import Poolimport  time, random
def show(i):    time.sleep(random.random() * 3)    print(i)
if __name__=='__main__':
    p = Pool()    for i in range(5):        p.apply_async(show, args=(i,))    time.sleep(5)    print("apply done...")    p.close()    #进程池close了才能使用join    p.join()    #join会阻塞到进程池全部进程执行完    print("All done.")

进程间通信

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

代码语言:javascript
复制
from multiprocessing import Process, Queueimport time, random
def PutQueue(q):    time.sleep(random.random())    q.put('yyt')def GetQueue(q):    while True:        value = q.get()        print ('Get %s.' % value)
if __name__=='__main__':    q = Queue()    pq = Process(target=PutQueue, args=(q,))    gq = Process(target=GetQueue, args=(q,))    gq.start()    pq.start()    pq.join()    #强行终止GetQueue    gq.terminate()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 歪歪梯Club 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • fork子进程
  • 创建独立子进程
  • 使用进程池
  • 进程间通信
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档