【发布时间】:2011-01-15 15:24:24
【问题描述】:
我需要编写一个运行两个线程的简单应用程序: - 线程 1:定时运行,假设每 1 分钟运行一次 - 线程 2:只是一个“正常”的 while True 循环,它做“东西”
如果不是按时间间隔运行的要求,我根本不会看扭曲,但简单的 sleep(60) 还不够好,结构如下:
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.run()
在那里实现我想要的看起来真的很简单。
现在,我如何“正确”添加另一个线程?
我在这里看到两个选项:
- 使用线程库并运行两个“python 线程”,一个执行我的 while 循环,另一个运行 reactor.run()。但谷歌似乎反对这种做法,并建议使用扭曲线程
- 使用绞线。这就是我尝试过的方法,但不知何故这对我来说有点笨拙。
这是我想出的:
def timed_thread():
print 'i will be called every 1 minute'
return
def normal_thread():
print 'this is a normal thread'
time.sleep(30)
return
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.callInThread(normal_thread)
reactor.run()
这似乎可行,但是!我无法停止应用程序。如果我按下 ^C,它不会做任何事情(没有'callInThread',它会像你期望的那样停止)。 ^Z 轰炸到 shell,如果我然后执行 'kill %1' 它似乎会杀死进程(shell 报告),但 'normal' 线程继续运行。 kill PID 不会摆脱它,唯一的治疗方法是 kill -9。真奇怪。
所以。我究竟做错了什么?在扭曲中实现两个线程是正确的方法吗?我不应该为扭曲而烦恼吗?还有哪些其他“标准”替代方案可以实现定时呼叫? ('标准'我的意思是我可以 easy_install 或 yum 安装它们,我不想开始从随机网页下载和使用一些随机脚本)。
【问题讨论】:
-
你在twisted(和一般的python)中使用线程非常小心。你的“主要”在做什么? twisted 的一个常见用例是作为协议客户端/服务器,发出请求或侦听请求。反应器将处理这些请求,并假设它们是非阻塞的,将能够在特定的时间间隔触发特定的功能。
-
线程的危险在于,如果您不小心,一个线程可能会在另一个线程使用数据时修改数据,从而导致不可预测的行为。
-
所有 'main' 的目的只是触发这两个线程(实际上,正如您在示例中看到的那样,它只有 4 行),这两个函数都更复杂一些,但在术语上没有什么不寻常的处理另一个只是检查它,但这并不重要)。这两个线程不共享任何数据顺便说一句
标签: python multithreading twisted timedelay