Python thread.Timer()在我的进程中不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python thread.Timer()在我的进程中不起作用相关的知识,希望对你有一定的参考价值。
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
,这意味着现在你有两个进程,父和子并排运行。现在,父进程立即退出,因为在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()
以上是关于Python thread.Timer()在我的进程中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
我的debian无法上网,知道的进(interface是只读权限,无法修改啊)