2011-08-19 102 views
1

我正在尝试为主Pylons进程中的一些繁重计算创建后台进程。下面的代码:从Pylons调用的进程()创建叉

p = Process(target = instance_process, \ 
       args = (instance_tuple.instance, parent_pipe, child_pipe,)) 
    p.start() 

过程创建并启动,但似乎是从主要处理的叉:它听相同的端口和整个应用程序挂断。我究竟做错了什么?

在此先感谢。

回答

1

过程是一个分叉。如果你仔细观察它的实现,你会发现Process.start()调用fork。但是,它不会调用任何exec变体来更改执行上下文。

不过,这可能与在同一端口上侦听无关(除非父进程是多线程的)。程序挂在哪一点? 我知道,当你试图关闭一个python程序而不终止通过多处理创建的子进程时,它会挂起,直到子进程终止。 例如,如果您不关闭进程之间的管道,可能会导致这种情况。

+0

那么启动后台进程的最佳方式是什么?或者,也许最好开始一个线程?目标是创建一个进程/线程,它将等待传入的命令并执行相当长时间的繁重计算。 –

+0

Python线程已经退化。 Python解释器一次只运行一个执行线程,每100个命令(精确地)切换线程并打印会挂起整个进程(请阅读python [GIL](http://wiki.python.org/moin/) GlobalInterpreterLock))。我不会推荐Python的线程。 对于进程,计算完成后,您应该简单地使用'p.terminate()'和'p.join()' – immortal

+0

这些计算可以调用大量数据(500-700 Mb),并且不会每次用户想要使用它时都可以加载它。我使用subprocess.Popen()函数开始一个进程? –