进程浅析
1 from multiprocessing import Pipe,Process
2
3 def fun(conn):
4 conn.send([12,{'hello':'c'},'python'])
5 data=conn.recv()
6 conn.close()
7 print(id(conn),data)
8
9
10 if __name__=='__main__':
11
12 parent_conn,child_conn=Pipe() #獲取一個管道對象
13 p=Process(target=fun,args=(child_conn,)) #創建一個進程對象 導包也得是大寫
14 p.start()
15
16 print(parent_conn.recv(),id(parent_conn))
17 parent_conn.send('兒子你好')
18 p.join()
?>>>>>>>>>>>>>>>>>>>>>>>>>>>>管道對象處理進程數據的收發
1 import multiprocessing 2 def show(num,l): 3 # with l: #如果用with則默認寫鎖名就上鎖 4 l.acquire() #啟動鎖 5 print('hello python process %s'%num) 6 l.release() #釋放鎖 7 8 if __name__=='__main__': 9 lock=multiprocessing.Lock() #創建一個進程同步鎖 10 for i in range(10): 11 p=multiprocessing.Process(target=show,args=(i,lock)).start() #生成并啟動十個進程對象>>>>>>>>>>>>>>>>>同步鎖實現進程的同步? 為了避免同一時刻爭搶資源造成數據紊亂
>>>>>>>>>>>>>>>>>進程數據的共享使用manager來實現
1 import os 2 import multiprocessing 3 import time 4 def show(num): 5 time.sleep(1) 6 print(num,os.getpid()) 7 return 'hello python{0}'.format(num) 8 9 def ret(arg): #必須有一個參數 10 print(arg,os.getpid()) #回掉函數此時顯示的arg 就是之前被執行函數的返回值 return 'hello python{0}'.format(num) 11 12 13 if __name__=='__main__': 14 pool=multiprocessing.Pool(5) #創建的線程池數量 15 for i in range(100): 16 pool.apply_async(func=show,args=(i,),callback=ret) #進程異步使用 回調函數使用的是主進程 17 18 pool.close() #關閉進程 19 pool.join() #進程池執行完再執行主進程 20 21 print('process the end')>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>回調函數是依附于主線程執行的 主要用于寫日志
隨意切換進程運行可以使用greenlet模塊下的g.switch方法 也是作為啟動的
1 import greenlet 2 def t1(): 3 print(125) 4 gr1.switch() 5 print('abc') 6 7 def t2(): 8 print('hahaha') 9 gr2.switch() 10 print('python') 11 gr2.switch() 12 13 gr1=greenlet.greenlet(t2) #調t2 14 gr2=greenlet.greenlet(t1) #調t1 15 16 gr1.switch() #啟動?
>>>>>>>>>>>>>>>>>>>通過協程的方法來實現進程效率的提升
1 import requests,time 2 import gevent 3 start=time.time() 4 def f(url): 5 print('GET: %s' % url) 6 resp = requests.get(url) 7 data = resp.text 8 print(len(data)) 9 10 11 gevent.joinall([ 12 gevent.spawn(f, 'https://www.python.org/'), 13 gevent.spawn(f, 'https://www.yahoo.com/'), 14 gevent.spawn(f, 'https://github.com/'), 15 ]) 16 17 print(time.time()-start)?
轉載于:https://www.cnblogs.com/wen-kang/p/9427602.html
總結
- 上一篇: mysql数据库基本操作命令
- 下一篇: day14之模块