簡體   English   中英

多處理:沒有來自第三個進程的 output

[英]Multiprocessing: no output from third process

上下文:我有 3 個文件:其中 2 個每 10 秒收集一次數據,其中一個應該收集這些數據用於機器學習。 我已經設置了多處理,其中每個文件都有一個 function 包含制作其 class 的實例並調用必要的函數,然后主要制作 3 個進程,啟動並加入它們,其中第三個進程僅啟動並加入每個10 秒,因為那是數據進入和需要的時間。

import gui_and_keyboard_features
import brain_features
import machine_learning

import multiprocessing as mp
import sys
import time

# increase recursion limit
sys.setrecursionlimit(15000)

def first_file():
    gui1 = gui_and_keyboard_features.gui()
    gui1.realtime()
    gui1.every_5_min()
    gui1.main_window.mainloop()
 
def second_file():
    myBoard = brain_features.braindata(-1, 'COM3')
    myBoard.startStream()
    myBoard.collectData()
    # print(myBoard.compressed_brain_training_features)
 
def third_file():
    # machine learning related
    myml = machine_learning.ml()
    myml.add_raw_data()
    # myml.add_training_data()
    # myml.train_model()
    # myml.predict()
    # keyboard related
    ml_keyboard_data = gui_and_keyboard_features.gui()
    ml_keyboard_data.realtime()
    ml_keyboard_data.every_5_min()
    ml_keyboard_data.main_window.mainloop()
    # brain related
    ml_brain_data = brain_features.braindata()
    ml_brain_data.startStream()
    ml_brain_data.collectData()
 
if __name__ == "__main__":
    # add ml file code here

    start_time = time.time()

    proc1 = mp.Process(target=first_file)
    proc2 = mp.Process(target=second_file)
    proc3 = mp.Process(target=third_file)

    proc1.start()
    proc2.start()

    proc1.join()
    proc2.join()

    print("we are here")

    while True:
        if (int(time.time() - start_time) % 10 == 0.0) and (int(time.time() - start_time) != 0.0):
            proc3.start()
            proc3.join()

    print("finished running")

問題:運行多處理文件時,我只從 2 個數據文件中得到 output,而從第 3 個機器學習文件中什么也沒有。 There are no while loops contained in the 2 data files, but one file is connected to a gui made with tkinter where a.after() function that takes a time interval and function and continuously reruns the function after that time interval. 我已經設置了打印語句,其中這些.after() 函數出現在第一個數據文件以及第二個數據和機器學習文件中。 當它通過多處理文件運行時,它會正確循環這些數據文件,但它永遠不會到達機器學習文件中包含的打印語句。

self.main_window.after(9500, self.realtime)
self.main_window.after(10000, self.every_5_min)
every 10s keyboard features
every 5 min keyboard features
brain features
every 10s keyboard features
every 5 min keyboard features
brain features
every 10s keyboard features
every 5 min keyboard features
brain features
every 10s keyboard features
every 5 min keyboard features
brain features

多處理的默認方案應該是啟動進程列表,然后是加入它們的列表,如果你啟動並加入,你會遇到錯誤。 因此,如果您希望子進程每 10 秒執行一次操作,則需要從多處理中使用 Pool。 因此,根據我對您的解釋的理解,您需要將每個子進程設置為工作者,然后您將使用工作者 1 和 2 與您在那里所做的類似,但第 3 個工作應該在不需要時進入休眠狀態。

實際上,您的代碼甚至在到達您的while loop之前就停止了。 或者"we are here"是否曾經印刷過? 在進程 1 和 2 上使用join將等待這些進程終止。 但是因為你有無限的進程 1 和 2 你的腳本永遠不會繼續。 嘗試在沒有join語句的情況下運行它。

此外,您可能希望在調用proc1.start() (與 proc2 相同)之前實現proc1.daemon = True以確保在主進程停止后子進程被終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM