사용 중 :
def myFunction(arg):
for i in range(10000):
pass
from multiprocessing import Pool
pool = Pool(processes=3)
pool.map_async( myFunction, ['first','second','third'] )
사용자가 풀이 시작된 후 주어진 시간에 멀티 프로세싱 풀의 실행을 일시 중지 할 수 있기를 바랍니다. 그런 다음 사용자가 풀의 나머지 항목을 사용하여 일시 중지를 해제 (계속) 할 수 있기를 바랍니다. 그것을 달성하는 방법?
다음은 Blckknght가 게시 한 제안의 실제 구현입니다. 감사합니다 Blckknght!
import multiprocessing
from PyQt4 import QtGui, QtCore
def setup(event):
global unpaused
unpaused = event
def myFunction( arg=None):
unpaused.wait()
print "Task started...", arg
for i in range(15000000):
pass
print '...task completed.', arg
class MyApp(object):
def __init__(self):
super(MyApp, self).__init__()
app = QtGui.QApplication(sys.argv)
self.mainWidget = QtGui.QWidget()
self.mainLayout = QtGui.QVBoxLayout()
self.mainWidget.setLayout(self.mainLayout)
self.groupbox = QtGui.QGroupBox()
self.layout = QtGui.QVBoxLayout()
self.groupbox.setLayout(self.layout)
self.pauseButton = QtGui.QPushButton('Pause')
self.pauseButton.clicked.connect(self.pauseButtonClicked)
self.layout.addWidget(self.pauseButton)
self.okButton = QtGui.QPushButton('Start Pool')
self.okButton.clicked.connect(self.startPool)
self.layout.addWidget(self.okButton)
self.layout.addWidget(self.pauseButton)
self.mainLayout.addWidget(self.groupbox)
self.mainWidget.show()
sys.exit(app.exec_())
def startPool(self):
self.event = multiprocessing.Event()
self.pool=multiprocessing.Pool(1, setup, (self.event,))
self.result=self.pool.map_async(myFunction, [1,2,3,4,5,6,7,8,9,10])
self.event.set()
# self.result.wait()
def pauseJob(self):
self.event.clear()
def continueJob(self):
self.event.set()
def pauseButtonClicked(self):
if self.pauseButton.text()=='Pause':
print '\n\t\t ...pausing job...','\n'
self.pauseButton.setText('Resume')
self.pauseJob()
else:
print '\n\t\t ...resuming job...','\n'
self.pauseButton.setText('Pause')
self.continueJob()
if __name__ == '__main__':
MyApp()
multiprocessing.Event
작업자 함수의 실행을 제어 하기 위해 a를 사용하려는 것 같습니다 . 하나를 만든 다음 initializer
풀에 전달한 다음에서 기다릴 수 있습니다 myFunction
.
다음은 매초마다 인수를 인쇄하는 워커를 실행하는 예제입니다. 작업자는 clear
이벤트를 실행하여 일시 중지 하고 다시 시작하여 다시 시작할 수 있습니다 set
.
from time import sleep
import multiprocessing
def setup(event):
global unpaused
unpaused = event
def myFunction(arg):
for i in range(10):
unpaused.wait()
print(arg)
sleep(1)
if __name__ == "__main__":
event = multiprocessing.Event() # initially unset, so workers will be paused at first
pool = multiprocessing.Pool(3, setup, (event,))
result = pool.map_async(myFunction, ["foo", "bar", "baz"])
event.set() # unpause workers
sleep(5)
event.clear() # pause after five seconds
sleep(5)
event.set() # unpause again after five more seconds
result.wait() # wait for the rest of the work to be completed
작업자 프로세스는 인쇄해야합니다 "foo"
, "bar"
그리고 "baz"
각각의 반복 사이에 일초 지연, 각을 열 번. 작업자는 처음 5 초 후에 일시 중지되고 5 초 후에 다시 시작됩니다. 실제 사용 사례에 따라이 코드를 개선 할 수있는 다양한 방법이있을 수 있지만, 올바른 방향으로 나아가는 데 충분합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다