Python Twisted反应器在python进程中共享?

时间:2014-11-24 11:51:35

标签: python twisted reactor

试着问一个基本的是/否问题 - 我担心的答案是"没有" - 但如果它是"是",寻求指导如何!

我有一个用Twisted Python编写的SMTP服务器。它非常好用!函数调用的基本流程/顺序如下:

script1.py
from mailserver import startReactor, startListener, stopListener, stopReactor
startReactor()
startListener("p25")
startListener("p26")
# Handle incoming connections etc until sigint receivedand then exit cleanly
stopListener("p25")
stopListener("p26")
stopReactor()

我想做的是,在一个或多个单独的python脚本中(实际上,它是RobotFramework测试,但主体是相同的)是:

script2.py
from mailserver import startReactor, startListener, stopListener, stopReactor
startListener("p27")
# Handle incoming connections etc until all necessary stuff on p27 is complete
stopListener("p27")

最后

script3.py
from mailserver import startReactor, startListener, stopListener, stopReactor
stopListener("p25")
startListener("p25custom)
# Handle incoming connections etc until all necessary stuff on "custom" p27 is complete
stopListener("p25custom")
startListener("p25)

所以我的想法是在后台执行script1.py,然后执行script2,script3等,"更改"正在运行的侦听器列表,但这些侦听器附加到script1中的反应器....

通过监视ps -xaf和netstat,我可以看到所有脚本中的套接字打开,而script1干净地退出...但是在script2和script3中打开的套接字似乎没有关闭......

在mailserver.py中我维护了一个&#34; runningListeners&#34; (例如:{'p25': <<class 'twisted.internet.tcp.Port'> of mailserver.ConsoleSMTPFactory on 25>})作为startListener添加/删除,并根据需要调用stopListener。但是,这显然只是脚本1的本地,而不是&#34;共享&#34; 3个脚本之间的dict ...我非常怀疑在script2和script3中启动的听众实际上是&#34;附加&#34;反应堆在script1中启动,因为netstat / ps可能会建议 - 因此可能不会&#34;可用&#34;听众...

所以是的,没问题 - 是否有可能做我正在尝试使用多个python脚本,如果是这样,任何人都可以提出如何实现这一点的建议?

非常感谢!

1 个答案:

答案 0 :(得分:0)

一种解决方案是使script1更智能。这样它就可以运行一个单一的扭曲反应堆,但也可以运行额外的轮询代码来监控文件系统或网络上的定制指令&#39;从其他两个脚本发送。

然后来自其他两个脚本的指令将指示script1关于要监听的内容(例如,要监听的端口等以及在事件发生时应该运行的处理程序代码,可能使用子进程模块进行委托)并指示何时应该停止听众。

所以我猜答案是肯定的,但不容易,所以你可能希望先重新考虑你的设计。