python 多進程
阿新 • • 發佈:2017-06-08
等待 else 任務 元組 utf int sin num 調度算法
1. 進程 VS 程序
編寫完畢的代碼,在沒有運行的時候,稱之為程序
正在運行著的代碼,就成為進程
進程,除了包含代碼以外,還有需要運行的環境等,所以和程序是有區別的
FORK
#coding=utf-8 import os import time num = 0 # 註意,fork函數,只在Unix/Linux/Mac上運行,windows不可以 pid = os.fork() #相當於創建了2個進程
if pid == 0: num+=1 print(‘哈哈1---num=%d‘%num) else: time.sleep(1) num+=1 print(‘哈哈2---num=%d‘%num)
運行結果:
總結:
- 多進程中,每個進程中所有數據(包括全局變量)都各有擁有一份,互不影響
- 只能在linux/unix 裏執行,windows裏沒有fork
- fork 會在執行的時候生產一個PID 為0 的子進程。
結果
多次fork問題
如果在一個程序,有2次的fork函數調用,是否就會有3個進程呢?
#coding=utf-8 import os import time # 註意,fork函數,只在Unix/Linux/Mac上運行,windows不可以 pid = os.fork() if pid == 0: print(‘哈哈1‘) else: print(‘哈哈2‘) pid = os.fork() if pid == 0: print(‘哈哈3‘) else: print(‘哈哈4‘) time.sleep(1)
運行結果:
所以 上面的if else 分成兩個進程,兩個進程結束後又各自分出2個進程 一共四個進程。
父子進程的執行順序
父進程、子進程執行順序沒有規律,完全取決於操作系統的調度算法
#下面是fork炸彈,不信你可以一下。。 while Ture: os.fork
multiprocessing
如果你打算編寫多進程的服務程序,Unix/Linux無疑是正確的選擇。由於Windows沒有fork調用,難道在Windows上無法用Python編寫多進程的程序?
由於Python是跨平臺的,自然也應該提供一個跨平臺的多進程支持。multiprocessing模塊就是跨平臺版本的多進程模塊。
multiprocessing模塊提供了一個Process類來代表一個進程對象,下面的例子演示了啟動一個子進程並等待其結束:
from multiprocessing import Process # 子進程要執行的代碼 def test(name): print(‘子進程運行中,name= %s ,pid=%d...ppid=%d‘ % (name, os.getpid(),os.getppid())) if __name__==‘__main__‘: print(‘父進程 %d.‘ % os.getpid()) p = Process(target=test, args=(‘test‘,)) print(‘子進程將要執行‘) p.start()#讓這個進程開始執行test函數裏的代碼 p.join()# 等待子進程結束 print(‘子進程已結束‘)
運行結果:
Process
- target:表示這個進程實例所調用對象
- args:表示調用對象的參數元組
- name:為當前進程實例的別名
Process常用方法:
- is_alive():判斷進程實例是否還在執行;
- join(【timeout】):是否等待進程實例執行結束,timeout:超時時間
- start():啟動進程實例(創建子進程)
- run():如果沒有給定target參數,對這個對象調用start()方法時,將執行對象的run方法
- terminate():不管任務(進程)是否結束,立即終止
python 多進程