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()
,"你好:D"反复打印。
但是,流程并没有像我预期的那样发挥作用。为什么"你好:D" 不在我的流程中打印?
我的流程中发生了什么?
答案 0 :(得分:2)
您的代码存在两个问题:
首先:您使用rawDeque
启动流程。这样做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()
启动独立进程)和线程(在进程中启动一个线程)。虽然这不是一个真正的问题,但它使调试变得更加困难(例如,上面的代码有一个问题是你不能用ctrl-c来阻止它,因为你的衍生进程是由OS继承并继续运行的)。你为什么不这样做?
fork