1. 程式人生 > 實用技巧 >Python多工-程序

Python多工-程序

程序的建立-multiprocessing

multiprocessing模組就是跨平臺版本的多程序模組,提供了一個Process類來代表一個程序物件,這個物件可以理解為是一個獨立的程序,可以執行另外的事情

# -*- coding:utf-8 -*-
from multiprocessing import Process
import time

def run_proc():
   """子程序要執行的程式碼"""
   while True:
       print("----2----")
       time.sleep(1)

if __name__=='__main__'
: p = Process(target=run_proc) p.start() while True: print("----1----") time.sleep(1)

建立子程序時,只需要傳入一個執行函式和函式的引數,建立一個Process例項,用start()方法啟動

程序pid

# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time

def run_proc():
    """子程序要執行的程式碼"""
    print('
子程序執行中,pid=%d...' % os.getpid()) # os.getpid獲取當前程序的程序號 print('子程序將要結束...') if __name__ == '__main__': print('父程序pid: %d' % os.getpid()) # os.getpid獲取當前程序的程序號 p = Process(target=run_proc) p.start()

Process語法結構如下:

  1. Process([group [, target [, name [, args [, kwargs]]]]])
  • target:如果傳遞了函式的引用,可以任務這個子程序就執行這裡的程式碼
  • args:給target指定的函式傳遞的引數,以元組的方式傳遞
  • kwargs:給target指定的函式傳遞命名引數
  • name:給程序設定一個名字,可以不設定
  • group:指定程序組,大多數情況下用不到
  1. Process建立的例項物件的常用方法:
  • start():啟動子程序例項(建立子程序)
  • is_alive():判斷程序子程序是否還在活著
  • join([timeout]):是否等待子程序執行結束,或等待多少秒
  • terminate():不管任務是否完成,立即終止子程序
  1. Process建立的例項物件的常用屬性:
  • name:當前程序的別名,預設為Process-N,N為從1開始遞增的整數
  • pid:當前程序的pid(程序號)

給子程序指定的函式傳遞引數

# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
from time import sleep


def run_proc(name, age, **kwargs):
    for i in range(10):
        print('子程序執行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
        print(kwargs)
        sleep(0.2)

if __name__=='__main__':
    p = Process(target=run_proc, args=('test',18), kwargs={"m":20})
    p.start()
    sleep(1)  # 1秒中之後,立即結束子程序
    p.terminate()
    p.join()
執行結果:

子程序執行中,name= test,age=18 ,pid=45097...
{'m': 20}
子程序執行中,name= test,age=18 ,pid=45097...
{'m': 20}
子程序執行中,name= test,age=18 ,pid=45097...
{'m': 20}
子程序執行中,name= test,age=18 ,pid=45097...
{'m': 20}
子程序執行中,name= test,age=18 ,pid=45097...
{'m': 20}

程序間不同享全域性變數

# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time

nums = [11, 22]

def work1():
    """子程序要執行的程式碼"""
    print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
    for i in range(3):
        nums.append(i)
        time.sleep(1)
        print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))

def work2():
    """子程序要執行的程式碼"""
    print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))

if __name__ == '__main__':
    p1 = Process(target=work1)
    p1.start()
    p1.join()

    p2 = Process(target=work2)
    p2.start()
執行結果:

in process1 pid=11349 ,nums=[11, 22]
in process1 pid=11349 ,nums=[11, 22, 0]
in process1 pid=11349 ,nums=[11, 22, 0, 1]
in process1 pid=11349 ,nums=[11, 22, 0, 1, 2]
in process2 pid=11350 ,nums=[11, 22]
程序間通訊-Queue
可以使用multiprocessing模組的Queue實現多程序之間的資料傳遞,Queue本身是一個訊息列隊程式。

我們以Queue為例,在父程序中建立兩個子程序,一個往Queue裡寫資料,一個從Queue裡讀資料:
from multiprocessing import Process, Queue
import os, time, random

# 寫資料程序執行的程式碼:
def write(q):
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())

# 讀資料程序執行的程式碼:
def read(q):
    while True:
        if not q.empty():
            value = q.get(True)
            print('Get %s from queue.' % value)
            time.sleep(random.random())
        else:
            break

if __name__=='__main__':
    # 父程序建立Queue,並傳給各個子程序:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 啟動子程序pw,寫入:
    pw.start()    
    # 等待pw結束:
    pw.join()
    # 啟動子程序pr,讀取:
    pr.start()
    pr.join()
    # pr程序裡是死迴圈,無法等待其結束,只能強行終止:
    print('')
    print('所有資料都寫入並且讀完')

"""
輸入如下:
Put A to queue...
Put B to queue...
Put C to queue...
Get A from queue.
Get B from queue.
Get C from queue.

所有資料都寫入並且讀完
"""

歡迎關注公眾號:Python爬蟲資料分析挖掘,回覆【開源原始碼】免費獲取更多開源專案原始碼

公眾號每日更新python知識和【免費】工具