2017-02-20 160 views
-1

我想在Python中同時運行兩個函數。這兩個函數都包含while循環。我曾嘗試使用線程和多處理而沒有喜悅。只有一個功能運行。我已經閱讀並嘗試了Stack和Net上的幾個例子。任何幫助,將不勝感激。提前致謝。我是Python的新手。使用多線程運行兩個包含While循環同時循環的函數

if __name__ == "__main__": 
    ap = argparse.ArgumentParser() 
    ap.add_argument("-c", "--conf", required=True, 
     help="path to the JSON configuration file") 
    args = vars(ap.parse_args()) 
# p1 = Process(target=main(args)) 
# p2 = Process(target=cameraHandler(args)) 
# p1.start() 
# p2.start() 

    threadA = Thread(target = main(args)) 
    threadB = Thread(target = cameraHandler(args)) 
    threadA.run() 
    threadB.run() 

    threadA.join() 
    threadB.join() 
+0

要真正運行「同時」功能,您需要使用'multiprocessing'。另外,我希望你認識到''''不是Python中的評論...你想''' –

+0

@ juanpa.arrivillaga這是一個很好的答案,做得很好!而且,正如你所知道的,它可以通過使用多線程來實現。另外,我知道##是Python中的一條評論。很好的回答啊,你顯然知道很多!你爲什麼不給解決問題而不是負面評論? – Wazzi

+0

我只是要求澄清,因爲你說你想在同一時間運行兩個函數*,而在CPython中,這是不可能的,因爲GIL確保只有一個線程在解釋器中運行時使用'multithreading'一旦。如果您真的想要利用多核架構,並行運行,則必須使用'multiprocessing'。這個API非常相似,所以如果你真的擔心這個問題,你應該能夠輕鬆地轉換你的代碼。我沒有讓你失望。 –

回答

0

在你的榜樣,你有target = main(args)target = cameraHandler(args)。在這兩種情況下,你都在調用函數本身,而不是讓線程去做。因此,只有第一個被調用,並且threadA從未被創建。您應該自行將函數(maincameraHandler)傳遞給Thread,而不用調用它們。

要解決此問題,請使用args關鍵字參數Thread。您還應該使用的.start()方法。

Thread(target=main, args=(args,)).start() 
Thread(target=cameraHandler, args=(args,)).start() 

這是假設args是您想要傳遞給每個函數的單個參數。如果它是一個的元組,所有您想要通過的參數,請使用args=args。例如,如果您希望線程運行f(1, 2, 3),請使用Thread(target=f, args=(1, 2, 3))

+0

不應該是deamons?如果我記得正確python將等待線程完成前繼續,如果線程不是deamon –

+0

@OwainvanBrakel根據我的測試,這不工作線程守護。 :) –

+0

我沒想到...感謝回答! –