2

好的,所以这可能有点不正统,或者我只是愚蠢或两者兼而有之:)

我正在尝试一个非常简单的设置,我在一个实例中启动一个瓶子服务器,Process并在另一个实例中启动一个小型 TFTP 服务器。

#!/usr/bin/env python
import bottle
import sys
import tftpy
from multiprocessing import Process

def main():
    try:
        t = Process(target=bottle.run(host='0.0.0.0', port=8080))
        t.daemon = True
        t.start()
        t.join()
        h = Process(target=tftpy.TftpServer('/srv/tftp').listen('0.0.0.0', 69))
        h.start()
        h.join()

    except KeyboardInterrupt:
        sys.stdout.write("Aborted by user.\n")
        sys.exit(1)

if __name__ == "__main__":
    main()

除非我完全疯了,否则我希望它们并行启动。实际上,发生的事情是瓶子启动并锁定了整个东西。如果我退出瓶子,TFTP 守护程序就会启动。

我还尝试了与threading模块类似的方法,结果大致相同。

我究竟做错了什么?

4

2 回答 2

6

有几个问题:

  • run()在主线程中调用。您应该改为传递参数args

    Process(target=bottle.run, kwargs=dict(host='0.0.0.0', port=8080))
    
  • 你调用 t.join(),它会阻塞直到 t 进程在 h.start() 之前结束。改为在所有进程启动后加入

  • 瓶子,tftpy 可能与多处理模块不兼容。如果是这样,您可以尝试子流程模块
于 2012-10-23T00:10:35.093 回答
0

好吧,我不确定我是否理解你想要完成的事情,但如果我在你的位置,我会尝试使用python-daemon 包

我认为两者都bottle可以TFTP被守护。由于您只是在寻找一个简单的测试,我猜 python-daemon 网页中给出的示例就足够了。

如果您真的喜欢将事物进行守护进程的想法,我还建议您搜索适合您平台的守护进程方法,因为这样您就有多种设施来管理您的守护进程,使它们与您的操作系统中找到的更相似。

对于一些简单的例子: http ://troydhanson.wordpress.com/2012/08/21/minimal-sysvinit-launchd-and-upstart/

于 2012-10-23T00:20:42.287 回答