2015-03-02 20 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,你應該指出你運行的是哪個版本。

希望它有幫助。