關(guān)于多線程的實(shí)現(xiàn)及理解震嫉,文章總覽這篇文章有給出推薦教程森瘪,故不贅述。
下面談?wù)劧噙M(jìn)程:
- 多進(jìn)程的四種代碼實(shí)現(xiàn)
- 多進(jìn)程的通信
- 如何啟動(dòng)外部進(jìn)程
1.關(guān)于多進(jìn)程的四種代碼實(shí)現(xiàn)票堵,可以看下面的鏈接扼睬,這里不贅述。
Python多進(jìn)程前三種實(shí)現(xiàn)-fork悴势、Process窗宇、Pool
Python多進(jìn)程第四種實(shí)現(xiàn)-ProcessPoolExecutor
2.多進(jìn)程的通信
通常來講,每個(gè)進(jìn)程包含三個(gè)部分:數(shù)據(jù)段特纤,代碼段和堆棧段军俊,而且進(jìn)程與進(jìn)程之間是獨(dú)立的,互不影響的捧存。
一個(gè)進(jìn)程間數(shù)據(jù)獨(dú)立的例子:
# 打印結(jié)果是每個(gè)列表(li)只有一個(gè)元素粪躬,因?yàn)槠鶈栴}就不貼上了
from multiprocessing import Process
li = []
process_list = []
def foo(i):
# 向列表中加入當(dāng)前的進(jìn)程序列號(hào)
li.append(i)
print('say hi', li)
for i in range(10):
p = Process(target=foo, args=(i,))
process_list.append(p)
for p in process_list:
p.start()
for p2 in process_list:
p2.join()
print('ending', li)
一個(gè)進(jìn)程間通信(數(shù)據(jù)共享)的例子:
進(jìn)程間通信可以使用Manager,Manager支持 list, dict, Condition, Event矗蕊,Queue, Value and Array等類型
# 打印結(jié)果是每個(gè)列表(li)包含多個(gè)元素短蜕,因?yàn)槠鶈栴}就不貼上了
from multiprocessing import Process,Manager
manager = Manager()
li = manager.list()
process_list = []
def foo(i):
# 向列表中加入當(dāng)前的進(jìn)程序列號(hào)
li.append(i)
print('say hi', li)
for i in range(10):
p = Process(target=foo, args=(i,))
process_list.append(p)
for p in process_list:
p.start()
for p2 in process_list:
p2.join()
print('ending', li)
3.啟動(dòng)外部進(jìn)程
會(huì)先打印 parent process 再執(zhí)行 ls 命令,有點(diǎn)像異步傻咖。
import subprocess
child = subprocess.Popen(["ls"])
print("parent process")
上一篇:「Python并發(fā)編程-2」基礎(chǔ)概念
下一篇:「Python并發(fā)編程-4」高并發(fā)模擬與處理