Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pause Multiprocessing Process in Python?

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?

like image 909
Mr.thread Avatar asked Mar 02 '15 14:03

Mr.thread


People also ask

How do I stop a process in Python multiprocessing?

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.

How does Python multiprocessing queue work?

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.

What is the difference between pool and process in multiprocessing?

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.


1 Answers

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.

like image 53
cdonts Avatar answered Oct 28 '22 03:10

cdonts