如何使用多进程python

#如何使用多进程
#由于python中全局解释锁(GIL)的存在,在任意时刻只允许一个线程在解释器中运行,
# 因此python的多线程不适合处理cpu密集型任务,想要处理cpu密集型任务,可以使用多进程模型
#解决方案:使用标准库中multiprocessing.Process,它可以启动子进程执行任务,操作接口,
# 进程间通信,进程同步等都与Threading.thread类似
'''如何使用它'''
from multiprocessing import Process
def d(s):
    print (s)
p=Process(target=f,args=('hello',))
p.start()
p.join()
x=1
def():
    global x 
    x=5
f()
'''进程间如何通信'''
from multiprocessing import Queue,Pipe
import Queue
q=Queue()
q.put(1)
q.get()
def f(q):
  print('start')
  print (q.get())
  print('end')
  
#启动一个子进程
Process(target=f,args=(q,)).start()
#pipe使用:会创建双向管道
c1,c2=Pipe()
c1.send('abc')#传入数据
c2.recv()#c2端读取出来
c2.send('xys')
c1.recv()

def f(c):
    c.send(c.recv()*2)
c1,c2=Pipe()
Process(target=f,args=(c2,)).start()
c1.send(55)
c1.recv()
#以多进程多线程执行一个Cpu任务,对比运行时间  
# 寻找水仙花数算法

#第一个函数判断某数是否水仙花数
def isArmstrong(n):
    a,t=[],n
    while t>0:
        a.append(t%10)
        t/=10
    k = len(a)
    return sum(x**k for x in a)==n
def findArmstrong(a,b):
    print(a,b)
    res =[k for k in range(a,b) if isArmstrong(k)]
    print ('%s ~ %s' % (a,b,res))
    
def findByThread(*argslist):
    workers =[]
    for args in argslist:
        worker=Thread(target=findArmstrong,args=args)
        workers.append(worker)
        worker.start()
    for worker in workers:
        worker.join()
        
def findByProcess(*argslist):
    workers=[]
    for args in argslist:
        worker=Process(target=findArmstrong,args=args)
        workers.append(worker)
        worker.start()
    for worker in workers:
        worker.join()
        
if __name__=='__main__':
    import  time
    start =time.time()
    findByProcess((20000000,30000000),(25000000,30000000))
    #findByThread((20000000, 30000000), (25000000, 30000000))#多线程
    print(time.time()-start)

猜你喜欢

转载自blog.csdn.net/weixin_38858860/article/details/89103469
今日推荐