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?
A process can be killed by calling the Process. kill() function. The call will only terminate the target process, not child processes. The method is called on the multiprocessing.
Python Multiprocessing modules provides Queue class that is exactly a First-In-First-Out data structure. They can store any pickle Python object (though simple ones are best) and are extremely useful for sharing data between processes.
While the Process keeps all the processes in the memory, the Pool keeps only those that are under execution. Therefore, if you have a large number of tasks, and if they have more data and take a lot of space too, then using process class might waste a lot of memory. The overhead of creating a Pool is more.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With