2015-10-20 53 views
0

我試圖使用subprocess.Process並行啓動幾個操作。我遇到的問題是,如果我嘗試在目標函數中實例化我的類的實例,則不會發生任何事情。但是,如果我首先實例化類並將實例傳遞給目標函數,那麼一切正常。下面是我所發射過程之前做python subprocess進程目標函數將不會實例化類

實例化一個抽象:一切工作的目標函數內部

def spawn(my_class_instance): 
    my_class_instance.launch() 

for params in my_list_of_parameters: 
    an_instance = MyClass(params) 
    Process(target=spawn, args=(an_instance)).start() 

實例化:不工作

def spawn(params): 
    an_instance = MyClass(params) 
    an_instance.launch() 

for params in my_list_of_parameters: 
    Process(target=spawn, args=(params)).start() 

我會真的很想了解更多關於爲什麼它不能嘗試實例化目標函數中的類。是否與立即致電Process.start()有關?引擎蓋下正在發生什麼阻礙?

可能造成這種情況的一個原因是每個MyClass.launch()本身都會調用subprocess.Popen(..., shell=False),以防萬一這可能是原因。如果是這樣,爲什麼?在第一種情況下它仍然被調用。

謝謝!

+1

你是什麼意思,它不起作用?你如何檢查?我只是自己嘗試過,並且兩種方式都能正常工作。你看到任何錯誤或任何東西? – ojii

+0

@ojii'MyClass.launch()'做了很多東西,將日誌打印到屏幕上,寫入文件......當我運行帶有第二個版本的「python my_script.py」時,沒有任何東西打印到控制檯,執行停止,我回來了到我的普通終端線路。 – ministry

回答

0

This works。不過,我可能是你的問題。

from multiprocessing import Process 

class MyClass: 
    def __init__(self, params): 
    pass 

    def launch(self): 
    print "method launch is called" 

def spawn(params): 
    an_instance = MyClass(params) 
    an_instance.launch() 

my_list_of_parameters = ['1', '2'] 

for params in my_list_of_parameters: 
    Process(target=spawn, args=(params)).start()