八.多线程与多进程
進(jìn)程與線程的區(qū)別
線程共享內(nèi)存空間,進(jìn)程的內(nèi)存是獨(dú)立的。
線程可以直接訪問(wèn)進(jìn)程里數(shù)據(jù)的片段,多個(gè)子進(jìn)程的數(shù)據(jù)是相互獨(dú)立的。
同一個(gè)進(jìn)程的線程直接可以交流,兩個(gè)進(jìn)程想通信必須通過(guò)一個(gè)中間代理來(lái)實(shí)現(xiàn)。
創(chuàng)建新線程很簡(jiǎn)單,創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一次克隆
一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程,進(jìn)程只能操作子進(jìn)程。
對(duì)于主線程修改,有可能影響其他線程的運(yùn)行。對(duì)父進(jìn)程修改不會(huì)影響其他子進(jìn)程。
?
#多線程示例 import threading def run(n):print("task",n)t1=threading.Thread(target=run,args=("t1",)) t2=threading.Thread(target=run,args=("t2",))t1.start() t2.start()?
?
?
?
queue隊(duì)列
作用:
1.解耦,使程序之間實(shí)現(xiàn)松耦合,修改模塊不會(huì)影響其他模塊
2.提高處理效率
queue與list區(qū)別:
queue拿取數(shù)據(jù),數(shù)據(jù)取走就沒(méi)了,list拿取數(shù)據(jù),數(shù)據(jù)還在list。
q=queue.Queue()#先入先出 q.put()#放數(shù)據(jù) q.get()#取數(shù)據(jù) q.queue.LifoQueue()#后進(jìn)先出?
import queue q=queue.PriorityQueue()#存儲(chǔ)數(shù)據(jù)時(shí)可以設(shè)置優(yōu)先級(jí) q.put((2,"b")) q.put((3,"c")) q.put((1,"a"))#輸出結(jié)果 (1, 'a') (2, 'b') (3, 'c') #生產(chǎn)者消費(fèi)者模型 import queueimport threading
import time
q=queue.Queue()
def Producer(name):
count = 1
while True:
q.put("商品%s" % count)
print("%s生產(chǎn)了商品"%name,count)
count += 1
time.sleep(0.5)
def Consumer(name):
while True:
print("%s買到商品%s" %(name, q.get()))
time.sleep(1)
p=threading.Thread(target=Producer,args=("生產(chǎn)者",))
c1=threading.Thread(target=Consumer,args=("買家1",))
c2=threading.Thread(target=Consumer,args=("買家2",))
p.start()
c1.start()
c2.start()
?
?
多進(jìn)程
import multiprocessing import timedef run(name):time.sleep(2)print('hello',name)if __name__ == '__main__': for i in range(10): p = multiprocessing.Process(target=run,args=('man %s'%i,)) p.start()?
進(jìn)程間通訊
Queue
from multiprocessing import Process,Queue import threadingdef f(q):q.put([123,'abc'])if __name__ == '__main__':q = Queue() p = Process(target=f, args=(q,)) p.start() print(q.get())?
Pipe
from multiprocessing import Process,Pipedef a(message):message.send([123,"fghr"])message.closeif __name__ == "__main__":pointa,pointb=Pipe()p=Process(target=a,args=(pointa,)) p.start() print(pointb.recv())?
manage
以代理的方式在進(jìn)程間共享字典或列表形式的數(shù)據(jù)
from multiprocessing import Process, Manager import os def f(d, l):d[os.getpid()] =os.getpid()l.append(os.getpid())print(l)if __name__ == '__main__': with Manager() as manager: d = manager.dict() #{} #生成一個(gè)字典,可在多個(gè)進(jìn)程間共享和傳遞 l = manager.list(range(5))#生成一個(gè)列表,可在多個(gè)進(jìn)程間共享和傳遞 p_list = [] for i in range(10): p = Process(target=f, args=(d, l)) p.start() p_list.append(p) for res in p_list: #等待結(jié)果 res.join() print(d) print(l)?
進(jìn)程池
進(jìn)程池內(nèi)部維護(hù)一個(gè)進(jìn)程序列,當(dāng)使用時(shí),則去進(jìn)程池中獲取一個(gè)進(jìn)程,如果進(jìn)程池序列中沒(méi)有可供使用的進(jìn)進(jìn)程,那么程序就會(huì)等待,直到進(jìn)程池中有可用進(jìn)程為止。
from multiprocessing import Process, Pool import time import osdef Foo(i):time.sleep(2)print("in process",os.getpid()) return i + 100 def Bar(arg): print('-->exec done:', arg,os.getpid()) if __name__ == '__main__': pool = Pool(processes=3) #允許進(jìn)程池同時(shí)放入5個(gè)進(jìn)程 print("主進(jìn)程",os.getpid()) for i in range(10): pool.apply_async(func=Foo, args=(i,), callback=Bar) #callback=回調(diào) #pool.apply(func=Foo, args=(i,)) #串行 #pool.apply_async(func=Foo, args=(i,)) #并行 print('end') pool.close()#這里join一定是在close之后,且必須要加join,否則主進(jìn)程不等待創(chuàng)建的子進(jìn)程執(zhí)行完畢 pool.join() #進(jìn)程池中進(jìn)程執(zhí)行完畢后再關(guān)閉,如果注釋,那么程序直接關(guān)閉。.join()?
轉(zhuǎn)載于:https://www.cnblogs.com/hiss/p/8455884.html
總結(jié)
- 上一篇: 突出告警信息(DBA_OUTSTANDI
- 下一篇: django用户认证系统——注册3