2016-11-08 158 views
1

我正努力使用下面的代碼使用Multiprocessing的Process函數同時運行2個函數。我最後的努力是運行一個定時器,它將在腳本的主體內部進行檢查。如果時間已經完成,主體中的依賴關係會觸發自己的行爲。如果時間沒有完成,它會轉到下一個動作。Python 3同時運行多個函數

我在MacBook Pro上與構建運行以下命令: 處理器名稱:Intel酷睿2雙核處理器 速度:1 核心總數:2

腳本2.66 GHz的 處理器數量:

#!/usr/bin/pyton 

# MODULES 
import time 
from multiprocessing import Process 

# GLOBAL VARIABLES 
Completion = '' 

# FUNCTIONS 
def Timer(duration): 
     global Completion 
     Ticker = 0 
     while Ticker != duration: 
       Ticker = Ticker + 1 
       print(Ticker) 
       time.sleep(1) 

     Completion = '{0}TickerDone'.format(duration) 

def Wait(seconds): 
     time.sleep(seconds) 

#MAIN 
P1 = Process(target = Timer(10)) 
P1.start() 

P2 = Process(target = Wait(11)) 
P2.start() 

P1.join() 
P2.join() 

print(Completion) 

if Completion == '10TickerDone': 
     print('Good to go!\n') 
else: 
     print('Not yet!\n') 

# END 

兩個功能做什麼是例外,然而第二功能,其旨在以等待10個+ 1 secondards用於第一功能的完成,僅開始一旦第一功能,10秒計時器,是完成。所以,在本質上,我必須等待21秒來測試10秒計時器。

結果:

$ python Test.py 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
10TickerDone 
Good to go! 

我需要做的是在並行運行這兩個功能,所以如果第一個功能是執行第三功能之前完成第二功能可以測試了。

我哪裏錯了?

+0

注意的文件,我嘗試同樣的事情線程,線程與進程替換,但有相同的結果。 – danjmwalker

+0

嗨馬克,我確實嘗試寫出來,因爲你有它,但我得到相同的結果。 (), – danjmwalker

+0

P1 =過程(目標=定時器(10),參數=(10,)) P2.start() P2 =過程(目標=等待,參數=(11,)) P2.start – danjmwalker

回答

1

你的主要問題是,你沒有在子進程中運行你的目標函數,你直接運行,然後開始另一個進程。

當你做這樣的代碼: P1 = Process(target = Timer(10)) Python會imediattely解決表達了target=部分的左 - 和調用函數,至極將等待10秒鐘,然後創建一個子對象,其目標實際上是返回該函數的值(None)。

所以,如果你只是做:

#MAIN 

P1 = Process(target=Timer, args=(10,)) 
P1.start() 

P2 = Process(target=Wait, args=(11,)) 
P2.start() 

你將開始看到的東西在你想要的方向發展。 看看不同之處:在這裏我使用函數名稱(根據約定可以是小寫,順便說一句),名稱後面沒有直接的「開放圓括號」。 Python中變量或函數名稱後面的括號表示一個同步對象調用(本例中爲函數調用)。不帶圓括號的同名的使用將該函數作爲您正在創建的Process對象的參數傳遞。參數在args參數中分開傳遞。

但除此之外,多處理根本無法使用全局變量 - 正如名稱所示,每個函數都在不同的進程中運行,並且有自己的一組全局變量)。

相反,您必須做一些更復雜的事情,並使用(多處理)Queue作爲子進程中每個入口點的參數傳遞,以協調您的並行代碼的操作。

檢查在https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

+0

謝謝,jsbueno。我最後的評論,我在第一個函數之後加入了(),是我的不好,打字太快了。感謝您的鏈接。我相信你是對的。我會花一點時間閱讀文檔。 – danjmwalker