问题
I want the user to be able to pause an execution of the multiprocessing at any given time after the was started.How to achieve it?
my code is :
# -*- coding: utf-8 -*-
from PySide import QtCore, QtGui
from Ui_MainWindow import Ui_MainWindow
from queue import Queue
import sys
import multiprocessing, os, time
def do_work():
print ('Work Started: %d' % os.getpid())
time.sleep(1)
return 'Success'
def manual_function(job_queue, result_queue):
while not job_queue.empty():
try:
job = job_queue.get(block=False)
result_queue.put(do_work())
except Queue.Empty:
pass
class Worker(QtCore.QThread):
def __init__(self,name):
QtCore.QThread.__init__(self)
self.name = name
self.pause = False
def run(self):
job_queue = multiprocessing.Queue()
result_queue = multiprocessing.Queue()
for i in range(1000):
job_queue.put(None)
self.workers = []
for i in range(6):
tmp = multiprocessing.Process(target=manual_function, args=(job_queue, result_queue))
tmp.start()
self.workers.append(tmp)
def paused(self):
'''
pause / resumme ?????????????????????????
'''
def stop(self):
for worker in self.workers:
print ("end")
worker.terminate()
worker.join()
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.connect(self.ui.actionStart, QtCore.SIGNAL('triggered()'),self.start)
self.connect(self.ui.actionStop, QtCore.SIGNAL('triggered()'),self.stop)
self.connect(self.ui.actionPause, QtCore.SIGNAL('triggered()'),self.pause)
def pause(self):
self.work.paused()
def stop(self):
self.work.stop()
def start(self):
self.threads = []
for tName in range(1):
self.work = Worker("Thread-%s"%tName)
self.threads.append(self.work)
self.work.start()
if __name__ == "__main__":
app = QtGui.QApplication (sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
How to pause button click Multiprocessing Process in Python?
回答1:
Use a simple flag as shared memory which determines if the spawned process runs or not. Check out a little example.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Process, Value
from time import sleep
def do_work():
print("Working...")
sleep(1)
def worker(run):
while True:
if run.value:
do_work()
if __name__ == "__main__":
run = Value("i", 1)
p = Process(target=worker, args=(run,))
p.start()
while True:
raw_input()
run.value = not run.value
I share an instance of Value between processes. Hit Enter to pause or resume the spawned process.
This works in Python 2, you should indicate which version are you running.
Hope it helps.
来源:https://stackoverflow.com/questions/28812011/how-to-pause-multiprocessing-process-in-python