Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理任务未运行_Python_Multithreading_Process_Queue - Fatal编程技术网

Python 多处理任务未运行

Python 多处理任务未运行,python,multithreading,process,queue,Python,Multithreading,Process,Queue,我有两个线程接收异步数据,并希望在主线程中处理这些数据。第一个进程运行主线程调用(ProcessA),但第二个进程从不执行。为了便于空间和解释,我简化了线程。 第一个线程是: import logging import time logging.basicConfig(filename='ProcessA.log',level=logging.DEBUG) from multiprocessing import Queue q = Queue() class ProcessA(q): g

我有两个线程接收异步数据,并希望在主线程中处理这些数据。第一个进程运行主线程调用(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)
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)
当我运行程序时,只有ProcessA运行(正如我在日志文件中看到的)

无论是在Windows 7终端中运行本机代码,还是在设置了“run>Configuration..>Execute in external terminal”(运行>配置..>Execute in external terminal)的Spyder中运行,我都会得到相同的结果

我可以做些什么来运行主线程的ProcessB和remainer

更新 将类从外部文件移动到内部函数是可行的,但是使用外部函数是行不通的

也就是说,该代码是有效的:

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类可以只是函数,如果您愿意这样做的话,它们将队列作为参数。否则,它应该继承进程(而不是q)并在初始化时接收队列。下面是一个很好的演练(队列和管道大约在中途):


您也可以尝试使用管理器来共享此状态。请参见

问题在于我导入外部函数的方式。我不需要“.py”扩展名。我从这篇文章中发现:

以下代码起作用:

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 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)
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)