我有一个不重复的过程(Selenium Webdriver),它可以运行100分钟甚至更长的时间。我的问题是我找不到在过程中进行暂停的方法。
我一直在尝试使用事件来解决它,但是到目前为止,我只是找到了解决方案,该解决方案会在迭代后终止,我一直认为从理论上讲可以在每一行代码之后都添加一个查询,询问是否将事件设置为继续处理,但这将非常困难,因为该函数中大约有数千行代码。
在此示例中,我还尝试通过另一个进程调用的事件暂停主进程,该事件在用户提供输入(例如Enter)时启动,但未连接进程,因此evet_func为还在运行。
import time
import multiprocessing
def event_func(num):
print('\t%r has started' % multiprocessing.current_process())
for i in range(1000):
time.sleep(0.1)
print(i)
print('\t%r has finished' % multiprocessing.current_process())
def event_wait(event):
print("Event Wait called")
event.wait()
print("Event wait finished")
if __name__ == "__main__":
event = multiprocessing.Event()
m = multiprocessing.Process(target=event_func, args=(1,), daemon=True)
m.start()
x = input("Waiting for input: ")
p = multiprocessing.Process(target=event_wait, args=(event,))
p.start()
print ('main is sleeping')
time.sleep(2)
print ('main is setting event')
event.set()
m.join()
我的预期结果是该过程可在函数中间暂停,而不是在迭代之后暂停。
答案 0 :(得分:0)
使用threading.Event
对象可以实现以下恢复和暂停功能。
答案 1 :(得分:0)
您可以使用os.kill
将signal.SIGSTOP
和signal.SIGCONT
发送到您的进程以暂停并继续执行:
import time
import multiprocessing
import os
import signal
def event_func(num):
print('\t%r has started' % multiprocessing.current_process())
for i in range(1000):
time.sleep(0.1)
print(i)
print('\t%r has finished' % multiprocessing.current_process())
if __name__ == "__main__":
event = multiprocessing.Event()
m = multiprocessing.Process(target=event_func, args=(1,), daemon=True)
m.start()
x = input("Waiting for input: ")
print("Pausing process...")
os.kill(m.pid, signal.SIGSTOP)
time.sleep(5)
print("Continuing process")
os.kill(m.pid, signal.SIGCONT)
m.join()