Python thread.Timer()在我的进程中不起作用

问题描述 投票:1回答:1
import os
import sys
from multiprocessing import Process, Queue
import threading

class Test:
  def __init__(self):
    print '__init__ is called'

  def say_hello_again_and_again(self):
    print 'Hello :D'
    threading.Timer(1, self.say_hello_again_and_again).start()


test = Test()
#test.say_hello_again_and_again()
process = Process(target=test.say_hello_again_and_again)
process.start()

这是测试代码。

结果:

pi@raspberrypi:~/Plant2 $ python test2.py
__init__ is called
Hello :D

如果我使用test.say_hello_again_and_again(),则重复打印“Hello:D”。

但是,流程并没有像我预期的那样发挥作用。为什么我的过程中没有打印“Hello:D”?

我的流程中发生了什么?

python multithreading process multiprocess
1个回答
2
投票

您的代码有两个问题:

第一:你用start()开始一个过程。这是做一个fork,这意味着现在你有两个进程,父和子并排运行。现在,父进程立即退出,因为在start()之后它就是程序的结束。要等到孩子完成(在你的情况下永远不会),你必须添加process.join()

我确实测试了你的建议,但它不起作用

确实。还有第二个问题:你用threading.Timer(1, ...).start()开始一个新的线程,但随后立即结束这个过程。现在,您不要等到线程启动,因为基础进程会立即死亡。你还需要等到线程停止使用join()

现在这就是你的程序的样子:

from multiprocessing import Process
import threading

class Test:
  def __init__(self):
    print '__init__ is called'

  def say_hello_again_and_again(self):
    print 'Hello :D'
    timer = threading.Timer(1, self.say_hello_again_and_again)
    timer.start()
    timer.join()

test = Test()
process = Process(target=test.say_hello_again_and_again)
process.start()
process.join()

但这最好是次优的,因为你混合多处理(使用fork启动独立进程)和线程(在进程中启动一个线程)。虽然这不是一个真正的问题,但它使调试变得更加困难(例如,上面的代码有一个问题是你不能用ctrl-c来阻止它,因为你的衍生进程是由OS继承并继续运行的)。你为什么不这样做?

from multiprocessing import Process, Queue
import time

class Test:
  def __init__(self):
    print '__init__ is called'

  def say_hello_again_and_again(self):
    while True:
        print 'Hello :D'
        time.sleep(1)

test = Test()
process = Process(target=test.say_hello_again_and_again)
process.start()
process.join()
© www.soinside.com 2019 - 2024. All rights reserved.