暂停Python中的非迭代过程

时间:2019-08-01 03:24:02

标签: python tkinter python-multiprocessing

我有一个不重复的过程(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()

我的预期结果是该过程可在函数中间暂停,而不是在迭代之后暂停。

2 个答案:

答案 0 :(得分:0)

使用threading.Event对象可以实现以下恢复和暂停功能。

似乎重复了:: Thread that I can pause and resume?

答案 1 :(得分:0)

您可以使用os.killsignal.SIGSTOPsignal.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()