2015-03-02 2 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_()) 

Как приостановить нажатие кнопки MultiProcessing процесса в 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, вы должны указать, какую версию вы используете.

Надеюсь, это поможет.

Смежные вопросы