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

Python thread.Timer() not works in my process

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" 不是 在我的进程中打印?

我的流程发生了什么?

您的代码有两个问题:

首先:您使用 start() 启动一个进程。这是在执行 fork,这意味着现在您有两个进程,parent 和 child 运行 并排。现在,parent 进程立即退出,因为在 start() 之后是程序的结尾。要等到 child 完成(在您的情况下永远不会),您必须添加 process.join().

I did test your suggestion, but it not works

确实如此。还有第二个问题:您使用 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()