2016-12-22 72 views
0

我一直在試驗我的代碼以發送「並行」命令到多個串行COM端口。Python多重處理比Windows上的多線程稍微慢

我的多線程代碼包括:

global q 
q = Queue() 
devices = [0, 1, 2, 3] 
for i in devices: 
    q.put(i) 
cpus=cpu_count() #detect number of cores 
logging.debug("Creating %d threads" % cpus) 
for i in range(cpus): 
    t = Thread(name= 'DeviceThread_'+str(i), target=testFunc1) 
    t.daemon = True 
    t.start() 

和多處理代碼包括:

devices = [0, 1, 2, 3] 
cpus=cpu_count() #detect number of cores 
pool = Pool(cpus) 
results = pool.map(multi_run_wrapper, devices) 

我觀察到在「並行發送串行命令至4個COM端口的任務「大約需要6秒鐘,多次處理總是需要0.5到1秒的額外總運行時間。

關於爲什麼Windows機器上的差異的任何輸入?

+1

多處理總是有額外的開銷與多線程。多線程使用與父進程相同的內存空間,而多進程需要爲進程分配新的內存。遊戲中可能有更多的因素,但這種開銷是給定的。 –

回答

1

呃,其中之一,你不是把蘋果與蘋果比較。如果您需要等效代碼,請在您的線程案例中使用multiprocessing.dummy.Pool(與線程方面的multiprocessing.Pool相同,而不是進程),因此您至少使用具有不同內部實現的相同基本並行化模型,而不是將所有內容全部更改立刻。

除此之外,啓動工作人員並向他們傳遞數據有一些開銷,在Windows上比在其他系統上花費更多,因爲Windows不能便宜地產生新的進程;它必須產生一個新的Python實例,然後通過IPC將狀態複製到近似分支。

除此之外,您還未提供足夠的信息;您的進程和基於線程的工作者功能不提供,並可能導致行爲上的顯着差異。你也沒有提供關於你如何執行時間的信息。同樣,如果每個工作進程需要重新初始化COM端口通信庫,這可能涉及不重要的開銷。

+0

感謝您的輸入。對於這兩種方法(多線程和多處理),工作者函數完全相同,除了multihtreading中的q.put()/ q/taskdone()調用。在每個線程實例中,我正在初始化一個新的COM端口,所以它實際上並不是開銷,因爲我不想重新初始化相同的COM端口。就目前而言,我認爲我正在開展多線程,因爲它似乎對我所要做的事情非常穩定,而且也相對更快。 (使用時間庫使用啓停時間差來計時)。 – eecs