2015-03-02 71 views
2

我希望用户能够在启动后的任何给定时间暂停多处理的执行。如何实现它?如何在Python中暂停多处理进程?

我的代码是:

# -*- 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中的多处理过程?

回答

4

使用一个简单的标记作为共享内存,它确定是否生成的进程运行或不运行。看看一个小例子。

#!/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的实例。点击输入暂停或恢复产生的进程。

这适用于Python 2,你应该指出你运行的是哪个版本。

希望它有帮助。