应用背景: 主进程和子进程需要独立运行,两边的消息不能阻塞。主进程需要时通知子进程运行,子进程运行完成后通知主进程,且两边变量不能混用
在主进程和子进程中各有一个类, 主进程负责管理,子进程负责运行。创建两个队列,公用与两个类,用于通信,两个类设置timer进行响应。
from multiprocessing import Queue, Process
from PyQt4.QtCore import QObject, QTimer
class AManager(QObject):
def __init__(parent=None):
super(AManager, self).__init__(parent)
self.timer = None
self.receive_queue = Queue()
self.send_queue = Queue()
self.proc = None
def starter_timer(self):
self.timer = QTimer(self)
self.timer.timeout.connect(self.slot_time_out)
self.timer.start(50)
def slot_time_out(self):
if self.receive_queue and not self.receive_queue .empty():
info = self.receive_queue .get_nowait()
pass # do something
def run(self):
if not self.proc:
self.proc = Process(target=con_fun, args=(self.receive_queue, self.send_queue))
self.proc.start()
self.send_queue.put(something)
def con_fun(receive_queue, send_queue):
sub_app = QtGui.QApplication([‘sub_process’])
sub_app.setObjectName(‘sub_process’)
bexe_obj = BExecute()
bexe_obj.send_queue = receive_queue
bexe_obj.receive_queue = send_queue
bexe_obj.start_timer()
return sub_app.exe_()
class BExecute(QObject):
def init(parent=None):
super(BExecute, self).init(parent)
self.timer = None
self.receive_queue = None
self.send_queue = None
def starter_timer():
self.timer = QTimer(self)
self.timer.timeout.connect(self.slot_time_out)
self.timer.start(50)
def slot_time_out():
if self.receive_queue and not self.receive_queue .empty():
info = self.receive_queue .get_nowait()
pass # do something