1. 程式人生 > >python 多進程

python 多進程

等待 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常用方法:

  1. is_alive():判斷進程實例是否還在執行;
  2. join(【timeout】):是否等待進程實例執行結束,timeout:超時時間
  3. start():啟動進程實例(創建子進程)
  4. run():如果沒有給定target參數,對這個對象調用start()方法時,將執行對象的run方法
  5. terminate():不管任務(進程)是否結束,立即終止

python 多進程