[英]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.