1. 程式人生 > >(一)使用multiprocessing模塊創造多進程

(一)使用multiprocessing模塊創造多進程

進程間通信 target 其他 時間片輪轉 代碼 字符 bob def pan

一、Intro:

1、爬蟲開發中,實現多進程是十分重要的(多個任務同時進行)。

2、時間片輪轉調度算法:所有進程輪流使用CPU,每個進程占用CPU的時間很短(100ms)。用戶看來仿佛所有的進程在不間斷運行。

3、進程->CPU分配資源的最小單位。

  線程->程序執行的最小單位。

  一個進程由多個線程組成。

4、父進程與子進程:子進程在處理過程中,只對父進程地址空間中的相關數據進行訪問,可以保護父進程地址空間中與當前子進程執行任務無關的全部數據。

二、使用"multiprocessing"模塊的‘‘Process"類創造多線程

技術分享

編譯環境:python 2.7.1

IDE:pycharm

保存為技術分享

import os
from multiprocessing import Process

def run_proc(name):
    print Child process %s (%s) Running... % (name,os.getpid())

if __name__ == __main__:
    print parent process %s. % os.getpid()
    for i in range(5):
        p = Process(target=run_proc,args=(str(i),))
        print
Process will start. p.start() p.join() print Process End

運行結果

parent process 1072.
Process will start.
Process will start.
Process will start.
Process will start.
Process will start.
Child process 0 (6676) Running...
Child process 1 (6752) Running...
Child process 2 (6864) Running...
Child process 
4 (6768) Running... Child process 3 (6580) Running... Process End Process finished with exit code 0

(1)定義run_proc函數,傳遞name參數並用os.getpid獲得當前進程的進程號

if __name__ == ‘__main__‘:   如果在其他代碼中調用本代碼的函數,該if條件之後的代碼將不會被執行,因為__name__ != ‘__main__‘

例如,在另一個文件tmp.py中調用run_proc函數:

import p17
p17.run_proc(1)
Child process 1 (7120) Running...

Process finished with exit code 0

當然也可以采用from...import...

from p17 import run_proc
run_proc(1)

(2)for i in range(5):  段
即在當前的父進程下,創建5個子進程。python官方手冊對Process類給予了更加易懂的版本:
from multiprocessing import Process

def f(name):
    print hello, name

if __name__ == __main__:
    p = Process(target=f, args=(bob,))
    p.start()
    p.join()
Process類需要傳遞兩個參數,target即在f所調用進程下 再創造一個子進程。args後接字符,用於子進程命名。start()方法和join()方法分別實現子進程的啟動和激活進程間通訊。

下期預告:

(1)使用multiprocessing模塊的pool類產生大量子進程

(2)使用Queue類和Pipe類實現進程間通信

(一)使用multiprocessing模塊創造多進程