python中的多進程運用

1. 程序中另起進程

from multiprocessing import Process
from os import getpid
from time import sleep

def run_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

def long_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 in range(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

def write(q):
    for i in range(5):
        print('puts {}'.format(i))
        q.put(i)
        sleep(1)

def read(q):
    sleep(10)
    while True:
        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()
    while True:
        if q.empty():  # 如果隊列中的數據都處理完了,則強制停止read方法
            pr.terminate()
            break
    print('END')
  • 信號量:Semaphore
from multiprocessing import Process, Semaphore
from time import sleep

def write(f):
    f.acquire()
    sleep(5)
    f.release()
    
    
if __name__ == '__main__':
    pp = []
    f = Semaphore(1)
    for i in range(5):
        p = Process(target=write, args=(f,))
        p.start()
        pp.append(p)
    for p in pp:
        p.join()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章