簡體   English   中英

多處理任務未運行

[英]Multi processing tasks not running

我有兩個線程接收異步數據,並希望在主線程中處理此數據。 主線程調用(ProcessA)運行第一個進程,但永遠不會執行第二個進程。 為了簡化篇幅和解釋,我簡化了線程。 第一個線程是:

import logging
import time
logging.basicConfig(filename='ProcessA.log',level=logging.DEBUG)
from multiprocessing import Queue
q = Queue()
class ProcessA(q):
    global variableA 
    logging.info('ProcessA started') 
    while (True):
        variableA = 'A' + str(time.time()) 
        q.put(variableA)
        logging.info (variableA)
        time.sleep(5)

第二個線程類似:

import time
from multiprocessing import Queue
import logging
logging.basicConfig(filename='ProcessB.log',level=logging.DEBUG)
q = Queue()
class ProcessB(q):
    logging.info('ProcessB started') 
    global variableB 
    while (True):
        variableB = 'B' + str(time.time()) 
        q.put (variableB)
        logging.info (variableB)
        time.sleep(2)

主調用線程如下:

import time 
from multiprocessing import  Process, Queue
import ProcessA.py
import ProcessB.py

import logging
logging.basicConfig(filename='MThread.log',level=logging.DEBUG)

if __name__ == "__main__":
    queue = Queue()
    a =Process(target=ProcessA, args=(queue,))
    a.start()

    b = Process(target=ProcessB, args=(queue,))
    b.start()

    while (True):
        if not queue.empty():
            variableC = queue.get()
            logging.info ("variableC ="+ variableC) 
            time.sleep(1)

當我運行程序時,僅運行ProcessA(如我在日志文件中看到的)。

無論我是在Windows 7終端中還是在Spyder中運行本機代碼,並設置了“運行>配置..>在外部終端中執行”,我都會得到相同的結果

我該怎么辦才能使ProcessB和主線程的其余部分運行?

更新將類從外部文件移動到內部函數有效,但是使用外部函數不起作用。

這是這段代碼的工作原理:

import time 
from multiprocessing import  Process, Queue
import logging
logging.basicConfig(filename='MThread2.log',level=logging.DEBUG)

def ProcessA(q):
    global variableA 
    logging.info('ProcessA started') 
    while (True):
        variableA = 'A' + str(time.time()) 
        q.put(variableA)
        logging.info (variableA)
        time.sleep(5)

def ProcessB(q):
    logging.info('ProcessB started') 
    global variableB 

    while (True):
        variableB = 'B' + str(time.time()) 
        q.put (variableB)
        logging.info (variableB)
        time.sleep(2)


if __name__ == "__main__":
    queueA = Queue()
    a =Process(target=ProcessA, args=(queueA,))
    a.start()
    queueB = Queue()
    b = Process(target=ProcessB, args=(queueB,))
    b.start()

    while (True):
        if not queueA.empty():
            variableC = queueA.get()
            logging.info ("variableC ="+ variableC) 
        if not queueB.empty():
            variableC = queueB.get()
            logging.info ("variableC ="+ variableC) 


        time.sleep(1)

但是,將代碼移到外部函數中也不起作用。

在這里很難說出到底是什么問題。.我在導入和分配類時看到一些小錯誤...

為了使您走上正確的道路:

如果您想這樣做,ProcessA和B類可能只是將Queue作為參數的函數。 否則,它應該繼承Process(不是q)並在初始化時進入隊列。 這是一個很好的演練(隊列和管道大約在中間): https : //www.geeksforgeeks.org/multiprocessing-python-set-2/

您也可以嘗試使用管理員來共享此狀態。 參見https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes

問題是我導入外部函數的方式。 我不需要'.py'擴展名。 我從這篇文章中發現了這一點: 在Python中從另一個文件調用函數

以下代碼有效:

import time 
from multiprocessing import  Process, Queue
from ProcessAF import processA
from ProcessBF import processB 


import logging
logging.basicConfig(filename='MThread.log',level=logging.DEBUG)

if __name__ == "__main__":

     queueA = Queue()
     a =Process(target=processA, args=(queueA,))
     a.start()

     queueB = Queue()
     b = Process(target=processB, args=(queueB,))
     b.start()

     while (True):
        if not queueA.empty():
            variableC = queueA.get()
            logging.info ("variableC ="+ variableC) 
            if not queueB.empty():
                variableC = queueB.get()
                logging.info ("variableC ="+ variableC) 


            time.sleep(1)

在同一目錄中名為ProcessAF.py的文件中具有以下功能:

import logging
import time
logging.basicConfig(filename='ProcessA.log',level=logging.DEBUG)
from multiprocessing import Queue
q = Queue()
def processA(q):

    global variableA 
    logging.info('ProcessA started') 
    while (True):
        variableA = 'A' + str(time.time()) 
        q.put(variableA)
        logging.info (variableA)
       time.sleep(5)

暫無
暫無

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

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