from multiprocessing import Process
from os import getpid
from time import sleep
defrun_time(name):
sleep(5)print('child progress {}: {}'.format(name, getpid()))if __name__ =='__main__':print('parent progress id: {}'.format(getppid()))# os.getpid(): 獲取當前進程ID; os.getppid(): 獲取父進程ID
p = Process(target=run_time, args=('hello_world',))# 初始化子進程:target=目前函數名, args=參數print('start child progress')
p.start()# 啓動子進程
p.join()# 進程同步:等待子進程執行完畢,程序再向下執行print('end child progress')
方法
getppid()、getpid()
p.start()
p.join()
Process(target=, args=(,))
Pool(n)
p.apply_async(, args=(,))
subprocess.call([’’, ‘’])
Queue()
q.put(value)
q.get(True)
2. 進程池
from multiprocessing import Pool
from os import getpid
from time import sleep
deflong_time_task(name):
sleep(5)print('child process {0}: {1}\n'.format(name, getpid()))if __name__ =='__main__':print('parent process: {0}\n'.format(getpid()))
p = Pool(2)## 初始化進程池:一次可並行執行2個進程(等這兩個執行結束,再次啓動執行接下來的兩個,和電腦是幾核的無關)for i inrange(10):
p.apply_async(long_time_task, args=(i,))## 進程池添加進程print('start child progress\n')
p.close()## 關閉進程池(不能再添加新進程了),準備執行進程
p.join()# 進程同步print('end child progress\n')
3. 問題:無法獲取子進程的執行結果 -> 子進程
import subprocess
print('nslookup www.python.org')
r = subprocess.call(['nslookup','www.python.org'])print('Exit code: {}'.format(r))
4. 進程間通信
隊列:Queue
from multiprocessing import Process, Queue
from time import sleep
from random import random
defwrite(q):for i inrange(5):print('puts {}'.format(i))
q.put(i)
sleep(1)defread(q):
sleep(10)whileTrue:
i = q.get(True)print('get {}'.format(i))if __name__ =='__main__':
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))print('START')
pw.start()
pr.start()
pw.join()whileTrue:if q.empty():# 如果隊列中的數據都處理完了,則強制停止read方法
pr.terminate()breakprint('END')
信號量:Semaphore
from multiprocessing import Process, Semaphore
from time import sleep
defwrite(f):
f.acquire()
sleep(5)
f.release()if __name__ =='__main__':
pp =[]
f = Semaphore(1)for i inrange(5):
p = Process(target=write, args=(f,))
p.start()
pp.append(p)for p in pp:
p.join()