Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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 如何在进程()中中断Queue.get()?_Python_Python 3.x_Pyqt_Multiprocessing_Pyqt5 - Fatal编程技术网

Python 如何在进程()中中断Queue.get()?

Python 如何在进程()中中断Queue.get()?,python,python-3.x,pyqt,multiprocessing,pyqt5,Python,Python 3.x,Pyqt,Multiprocessing,Pyqt5,当在目标函数run\u event()中实现队列时,我无法停止进程。队列需要从目标函数返回值。进程可以在没有队列的情况下停止 从PyQt5.qtwidts导入QHBoxLayout、QApplication、QWidget、QPushButton 从PyQt5.QtCore导入QThread 从多处理导入进程、队列、, def run_事件(参数、队列): “”“运行某些无法通过轮询停止的任务。” 返回一个数据帧 """ out=arbritrarySolver(params)#运行返回数据帧的

当在目标函数
run\u event()
中实现队列时,我无法停止进程。队列需要从目标函数返回值。进程可以在没有队列的情况下停止

从PyQt5.qtwidts导入QHBoxLayout、QApplication、QWidget、QPushButton
从PyQt5.QtCore导入QThread
从多处理导入进程、队列、,
def run_事件(参数、队列):
“”“运行某些无法通过轮询停止的任务。”
返回一个数据帧
"""
out=arbritrarySolver(params)#运行返回数据帧的解算器
排队
班级工作人员(QObject):
定义初始化(self,params):
super()。\uuuu init\uuuuu()
self.params=params
def停止工作(自身):
self.process.terminate()
def启动_工作(自):
self.queue=queue()
self.process=process(target=run_事件,args=(self.params,self.queue))
self.process.start()文件
output=self.queue.get()#run_事件的输出
类Gui(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.initUI()
def start_事件(自):
self.worker_thread=QThread()
self.obj=worker.worker(参数)
self.obj.moveToThread(self.worker\u线程)
self.worker\u线程.started.connect(self.obj.start\u工作)
self.stopButton.clicked.connect(self.obj.stop\u work)
self.worker_thread.start()
def initUI(self):
self.runButton=QPushButton('Run',self)
self.runButton.clicked.connect(self.start\u事件)
hbox=QHBoxLayout()
hbox.addWidget(self.runButton)
self.setLayout(hbox)
self.show()
如果名称=“\uuuuu main\uuuuuuuu”:
app=QApplication(sys.argv)
ex=Gui()
sys.exit(app.exec_())

如何实现在实现队列时使用停止按钮中断
run\u event()
的解决方案?

您可以将
timeout
参数用于
多处理.queue
并结合
time.sleep
定期取消阻止执行和处理事件(例如异常):

导入时间
将多处理作为mp导入
def run_事件(参数、队列):
时间。睡眠(10)
queue.put(参数)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
queue=mp.queue()
process=mp.process(target=run\u事件,args=('foo',queue))
process.start()
尽管如此:
尝试:
结果=queue.get(超时=0.1)
除mp.queues.Empty外:
通过
其他:
打破
打印(结果)

在您的示例中,您可以将
while True
替换为
while not self.\u stop\u execution
并在单击按钮时设置
self.\u stop\u execution=True

问题是,当您使用self.queue.get()时,您正在阻止工作线程所在的次线程,相反,一种可能的策略是使用计时器检查队列的状态,并相应地向GUI发送带有结果的信号

从functools导入部分
将多处理作为mp导入
从PyQt5导入QtCore、QtWidgets
从foo_软件包导入arbritrarySolver
def run_事件(参数、队列):
“”“运行某些无法通过轮询停止的任务。”
返回一个数据帧
"""
out=arbritrarySolver(params)#运行返回数据帧的解算器
排队
类工作者(QtCore.QObject):
resultChanged=QtCore.pyqtSignal(对象)
finished=QtCore.pyqtSignal()
定义初始化(自):
super()。\uuuu init\uuuuu()
self.m_timer=QtCore.QTimer(self)
self.m\u timer.timeout.connect(self.check\u结果)
self.process=None
@QtCore.pyqtSlot()
def停止工作(自身):
如果存在(自进程、mp进程):
self.process.terminate()
@QtCore.pyqtSlot(对象)
def启动_工作(自身、参数):
self.queue=mp.queue()
self.process=mp.process(target=run_事件,args=(params,self.queue))
self.process.start()文件
self.m_定时器启动(0)
@QtCore.pyqtSlot()
def检查结果(自身):
如果不是self.process.is_live():
self.finished.emit()
self.m_timer.stop()
如果不是self.queue.empty():
r=self.queue.get(block=False)
self.resultChanged.emit(r)
类Gui(QtWidgets.QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.worker_thread=QtCore.QThread(self)
self.worker_thread.start()
self.obj=Worker()
self.obj.moveToThread(self.worker\u线程)
self.obj.resultChanged.connect(self.onResultChanged)
self.obj.finished.connect(self.onFinished)
self.initUI()
@QtCore.pyqtSlot()
def start_事件(自):
params=“aaa”,“bbb”
包装器=部分(self.obj.start_work,参数)
QtCore.QTimer.singleShot(0,包装器)
self.runButton.setDisabled(True)
self.stopButton.setDisabled(假)
@QtCore.pyqtSlot()
def onFinished(自我):
self.runButton.setDisabled(False)
self.stopButton.setDisabled(真)
@QtCore.pyqtSlot(对象)
def onResultChanged(自身、结果):
打印(结果)
def initUI(self):
self.stopButton=qtwidts.QPushButton(“停止”)
self.stopButton.setDisabled(真)
self.runButton=qtwidts.QPushButton(“运行”)
self.runButton.clicked.connect(self.start\u事件)
self.stopButton.clicked.connect(self.obj.stop\u work)
hbox=qtwidts.QHBoxLayout(self)
hbox.addWidget(self.runButton)
hbox.addWidget(self.stopButton)
self.show()
def关闭事件(自身、事件):
self.obj.停止工作()
super().closeEvent(事件)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
ex=Gui()
sys.exit(app.exec_())

如果编辑不足,请告诉我!干杯。您想从哪里获得结果?我们的想法是将结果设置为工人类变量,这样我就可以执行