from multiprocessing import Process,Pool #进程池 import os,time def run(i): time.sleep(1) print ("in the process",os.getpid()) return i+100 def bar(arg): print ('bar is ',os.getpid()) if __name__=='__main__': p=Pool(5) for i in range(10): p.apply_async(func=run,args=(i,),callback=bar)#apply是串行执行进程 apply_async是并行执行进程。其中callback是回调方法,调用一个进程结束时执行,用于一些后续工作。如写入数据库日志等。 p.close() p.join() #必须是先close,然后再join.
#多进程 中的队列操作 from multiprocessing import Process,Queue import time,os def run(name,qq): # time.sleep(1) print(name,'sellp ') qq.put('abc') if __name__=='__main__': q=Queue() mp1=Process(target=run,args=('Jack',q)) mp1.start() print(q.get())
#多进程中,使用Manager共享数据 from multiprocessing import Process,Manager import os def pm(di,li): di[os.getpid()]=os.getppid() li.append(os.getpid()) if __name__=='__main__': o_list=[] with Manager() as manage: d1=manage.dict() l1=manage.list(range(5)) for i in range(10): p=Process(target=pm,args=(d1,l1)) p.start() o_list.append(p) for i in o_list: i.join() print (d1,l1)
#简单的gevent操作。 import gevent import os,time def func1(): print ('in the func1 A') gevent.sleep(2) print ('in the func1 B') def func2(): print('in the func2 A') gevent.sleep(3) print('in the func2 B') def func3(): print('in the func3 A') gevent.sleep(1) print('in the func3 B') start_time=time.time() gevent.joinall([gevent.spawn(func1), gevent.spawn(func2), gevent.spawn(func3)]) print ("time ",time.time()-start_time)
#用gevent urllib-request实现的协程爬虫。 from urllib import request from gevent import monkey import gevent,time monkey.patch_all() def hd(url): print ("Get:%s"%url) resp=request.urlopen(url) data=resp.read() print("%s data from is %s"%(len(data),url)) urllist=["http://www.python.org","https://www.yahoo.com/","http://www.orace.com/"] start_time=time.time() for i in urllist: hd(i) print ("同步时间:",time.time()-start_time) start_time_y=time.time() gevent.joinall( [gevent.spawn(hd,urllist[0]), gevent.spawn(hd,urllist[1]), gevent.spawn(hd,urllist[2]) ]) print("异步时间:",time.time()-start_time_y)