繁体   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