【问题标题】:time.sleep hangs multithread function in pythontime.sleep 在 python 中挂起多线程函数
【发布时间】:2012-10-02 15:45:01
【问题描述】:

我在挂起我的多线程函数的睡眠语句时遇到问题。我希望我的功能在程序的其余部分运行时继续它的业务。这是一个重现我的问题的玩具:

import multiprocessing, sys, time

def f(icount, _sleepTime = 1):
    for i in range(icount):
        time.sleep(_sleepTime)
        print(_sleepTime)

def main(args):
    m = multiprocessing.Process(target = f, args=(4, ))
    m.run()
    # f should be sleeping for 1 second so this print statement should come first
    print(m.is_alive())


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

谁能解释为什么这段代码会输出:

1
1
1
1
False

代替:

True
1
1
1
1

#

编辑

#

我最终想在一个时间表上运行这个函数,并在我执行这个函数之前测试它是否正在运行。这是一个例子:

import multiprocessing, sys, time

def f(icount, _sleepTime = 1):
    for i in range(icount):
        time.sleep(_sleepTime)
        print(_sleepTime)

def main(args):
    m = multiprocessing.Process(target = f, args=(4, ))
    for i in range(15):
        time.sleep(.5)
        if not m.is_alive():
            # m.start throws an error after first run
            m.run()
        print("{}".format(m.is_alive()))


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

【问题讨论】:

    标签: python python-3.x multiprocessing


    【解决方案1】:

    使用start 和join 代替run:

    import multiprocessing, sys, time
    
    def f(icount, _sleepTime = 1):
        for i in range(icount):
            time.sleep(_sleepTime)
            print(_sleepTime)
    
    def main(args):
        m = multiprocessing.Process(target = f, args=(4, ))
        m.start()
        # f should be sleeping for 1 second so this print statement should come first
        print(m.is_alive())
        m.join()
    
    
    if __name__ == "__main__":
        sys.exit(main(sys.argv[1:]))
    

    #

    编辑

    #

    同样,使用start 和join 代替run:

    import multiprocessing, sys, time
    
    def f(icount, _sleepTime = 1):
        for i in range(icount):
            time.sleep(_sleepTime)
            print(_sleepTime)
    
    def create_process():
        return multiprocessing.Process(target = f, args=(4, ))
    
    def main(args):
        m = create_process()
        m.start()
        for i in range(15):
            time.sleep(.5)
            if not m.is_alive():
                # m.start throws an error after first run
                print("restarting")
                m.join()
                m = create_process()
                m.start()
            print("{}".format(m.is_alive()))
        m.join()
    
    
    if __name__ == "__main__":
        sys.exit(main(sys.argv[1:]))
    

    【讨论】:

    • 好吧,我的玩具有点太简单了。我想要的是在while循环之外定义m = multiprocessing并在我再次运行之前测试它是否正在运行。
    • @posop:要么创建一个新进程,要么使用Pool
    猜你喜欢
    • 2018-04-24
    • 2018-09-02
    • 2012-04-18
    • 2014-09-15
    • 2021-11-13
    • 2016-04-09
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多