1、進程
- 運行起來的程序尔艇,叫進程尔许。
- 運行程序時,先加載在內(nèi)存终娃,然后告訴OS要做什么操作味廊。
- 進程創(chuàng)建多任務(wù),占用資源相當(dāng)大棠耕。進程就是在原基礎(chǔ)上copy一份主進程資源余佛。
import multiprocessing
#創(chuàng)建對象
def test1():pass
def test2():pass
def main():
p1 = multiprocessing.Process(target=test1)
p2 = multiprocessing.Process(target=test2)
#新的進程創(chuàng)建
p1.start()
p2.start()
main()
- 資源能共享的共享,實在不能共享的再copy一份窍荧。即:寫時拷貝
- 進程占用資源大衙熔,線程占用資源小
2、進程搅荞、線程對比
-
進程:實現(xiàn)多任務(wù),資源及代碼總稱红氯,進程是資源分配的單位。一個進程里面至少有一個主線程咕痛。進程間不共享全局變量痢甘,互相獨立。
-
線程:實現(xiàn)多任務(wù)茉贡,先有進程再有線程塞栅。真正實現(xiàn)任務(wù)的是線程。線程是操作系統(tǒng)調(diào)度的單位
3腔丧、進程間的通信
- socket
- 文件
- 隊列Queue放椰,先進先出作烟。
耦合度越高,程序越不好砾医,越低越好拿撩。通過隊列解耦,實現(xiàn)進程間通信如蚜。
Queue只能一個程序压恒,一個電腦里面實現(xiàn)進程間通信,還不能跨電腦错邦。以后使用redis探赫,實現(xiàn)分布式。
import multiprocessing
from multiprocessing import Queue
def write(q):
data = [1,2,3,4]
#數(shù)據(jù)放入隊列
for i in data:
q.put(i)
print("數(shù)據(jù)放入隊列中")
def read(q):
#取數(shù)據(jù)
readlist = list()
while True:
data = q.get()
readlist.append(data)
if q.empty():
break
print("數(shù)據(jù)從隊列中取出:",readlist)
def main():
#創(chuàng)建一個隊列撬呢,隊列長度5000
q = Queue(5000)
#創(chuàng)建多個進程伦吠,將隊列的引用當(dāng)做實參進行傳遞
p1 = multiprocessing.Process(target=write,args=(q,))
p2 = multiprocessing.Process(target=read,args=(q,))
#新的進程創(chuàng)建
p1.start()
p2.start()
if __name__ == '__main__':
main()
4、進程池Pool
- 進程池是一個特殊容器魂拦,容納很多進程毛仪。
- 程序的創(chuàng)建和銷毀會花大量時間和資源,所以進程池就可以解決這一問題晨另。