【问题标题】:Pause non-iterating process in Python在 Python 中暂停非迭代进程
【发布时间】:2019-12-09 14:27:09
【问题描述】:

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

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

【问题讨论】:

    标签: python tkinter python-multiprocessing


    【解决方案1】:

    您可以使用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()
    

    【讨论】:

    • 如果你必须支持 Windows,你可能想看看psutil。但是,它似乎依赖于未记录的函数。
    【解决方案2】:

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

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

    【讨论】:

    • OP 没有使用threading。该问题的标签错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2017-08-20
    • 1970-01-01
    • 2021-05-29
    • 2011-02-17
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多