刚刚向我介绍了如何通过this nice tutorial进行聊天的应用程序,但是我不确定如何使其适应我的需求。
假设我一时兴起,希望聊天服务器向所有客户发送友好的消息,例如“周末愉快!”。即我想让反应堆运行某些东西,但是已经运行了(所以我无法提前计划,或者我不想这样做)。
我想做这样的事情:
def do_something():
# do something
# setup and run reactor
factory = Factory()
factory.clients = []
factory.protocol = MyServer
reactor.listenTCP(80, factory)
reactor.run() # asynchronously?
# clients connect...
reactor.callLater(0, do_something)
我尝试使用python线程,但是没有用。我查看了these twisted examples,但它们最后都包含了react..run()语句,这使我不满意。是的,我很可能会遗漏一些基本知识(这就是为什么我在这里)。
最佳答案
您无需更改运行反应堆的方式即可实现此行为。
相反,只要意识到程序中的所有内容都是对某个事件的响应即可。
您何时发出“快乐的长周末”通知?当然,当一个漫长的周末即将开始时。换句话说,日历(这只是一种特殊的计时设备)会生成一个事件,然后您对此做出反应。您可以使用IReactorTime.callLater
来实现:计算直到下一个长周末和reactor.callLater(that_delay, some_function)
的时间。
如果您想在用户单击按钮时执行某些操作,则是对GUI库生成的事件的响应。如果要在连接USB设备时执行某些操作,则是对HAL平台(或DBUS或udev之类)生成的事件的响应。
每当您认为自己“自己采取行动”时,都要考虑其作用的原因-在什么条件下或在什么情况下作出反应-并且您将在弄清楚它实际对什么事件做出反应的途中。