如何在Python中暂停多处理进程? [英] How to pause Multiprocessing Process in Python?

查看:319
本文介绍了如何在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?

我的代码是:

# -*- 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_())

如何在Python中暂停按钮单击多处理进程"?

How to pause button click Multiprocessing Process in Python?

推荐答案

使用一个简单的标志作为共享内存,该标志确定生成的进程是否运行.看看一个例子.

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

我在进程之间共享 Value 的实例.点击 Enter 可以暂停或恢复生成的过程.

I share an instance of Value between processes. Hit Enter to pause or resume the spawned process.

这在Python 2中有效,您应该指出要运行的版本.

This works in Python 2, you should indicate which version are you running.

希望有帮助.

这篇关于如何在Python中暂停多处理进程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆