2012-10-23 25 views
1

好了,所以这可能是一个有点非正统或者我只是愚蠢或两者:)开始蟒蛇瓶在一个线程/进程和另一个守护旁边

我想一个很简单的设置,其中我在一个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

有几个问题:

  • 你在主线程中调用run()。你应该传递参数在args代替:

    Process(target=bottle.run, kwargs=dict(host='0.0.0.0', port=8080)) 
    
  • 调用t.join(),该块到t流程h.start前结束()。毕竟进程,而不是开始

  • 瓶加入,tftpy可能与多处理模块兼容。你可以尝试子模块,如果是这样
+0

调用'在主线程run'是问题。谢谢你,你睁开了眼睛,看到我刚刚俯视的一些非常明显的东西! :) – favoretti

+1

附注:both和tftp都是IO绑定的,而不是CPU绑定的。线程应该足够了,不需要产生额外的进程。 – defnull

+0

@defnull:如果没有他们的合作,线程很难被杀死,他们不会正确释放资源。 – jfs

0

好了,我不知道如果我理解你正在试图完成的任务,但如果我是你,我会尝试使用python-daemon package

我认为无论是bottleTFTP可能被守护进程。 因为你只在寻找一个简单的测试,我想这在蟒蛇守护网页给出的例子就足够了。

如果你真的喜欢将守护进程的想法,我建议你还要寻找适合你的平台的守护进程,这样你有几个工具来管理你的守护进程,使它们与发现的守护进程更相似在你的操作系统。

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

+0

如果我不清楚,请原谅我。我会确实守护神。但不是那两个过程。我正在编写自己的工具,它将嵌入瓶和TFTP以及_that_工具,我将确实使用'python-daemon'进行守护。我只是在寻找一种解决方案,在我自己的守护进程中将这两者作为独立的线程/子进程运行。 – favoretti

+0

我是否应该简单地删除此答案,因为它不会在问题中添加任何内容? –

+0

随意离开它:)它可能会增加一些有关python daemonizing的更多信息。 – favoretti