运行一个进程,不用等待就退出

在Windows下的Python中:我想在一个单独的进程中运行一些代码。 我不希望父母等待它结束。 试过这个:

from multiprocessing import Process from time import sleep def count_sheeps(number): """Count all them sheeps.""" for sheep in range(number): sleep(1) if __name__ == "__main__": p = Process(target=count_sheeps, args=(5,)) p.start() print("Let's just forget about it and quit here and now.") exit() 

启动subprocess并继续执行。 但是,当父母达到目的时,仍然等待孩子退出。

即使孩子在跑步,是否有办法让父母退出? 当然,我可以使用subprocess.Popen来运行一个新的python解释器,并将它作为一个单独的脚本提供给它。

尽pipe如此,还有整个模块用于处理Python代码的进程,所以我想利用这个模块而不是在操作系统上进行攻击。 另外,如果相同的代码可以在Python所在的任何地方工作,而不仅仅是在Windows上,那将是非常棒的。

不推荐使用subprocess进程模块作为其他子进程控制方法(os.system,os.spawn *,os.popen *,popen2。 ,commands。 ):

 from subprocess import Popen Popen( [ "foo.exe", "arg1", "arg2", "arg3" ) 

请参阅Python doco ,特别是P_NOWAIT示例。

你将不得不在子进程中启动一个新的Python解释器,所以上面的“foo.exe”可能是“python.exe”。

编辑:

刚刚查看了多处理模块文档:

join_thread() :加入后台线程。 这只能在close()被调用后才能使用。 它阻塞,直到后台线程退出,确保缓冲区中的所有数据已经​​刷新到管道。

默认情况下,如果一个进程不是队列的创建者,那么在退出时它将尝试加入队列的后台线程。 该进程可以调用cancel_join_thread()来使join_thread()什么也不做。

cancel_join_thread() :阻止join_thread()阻塞。 特别是,这可以防止后台线程在进程退出时自动加入 – 参见join_thread()

它看起来像你应该能够调用cancel_join_thread()来获得你想要的行为。 我从来没有使用过这种方法(直到一分钟前才知道它的存在!),所以一定要让我们知道它是否适用于您。

您可以使用p.daemon = True将进程声明为守护进程。 正如http://docs.python.org/2/library/threading.html#thread-objects所说:“这个标志的意义在于只有守护进程线程被留下时,整个Python程序才会退出。

 from multiprocessing import Process from time import sleep def count_sheeps(number): """Count all them sheeps.""" for sheep in range(number): sleep(1) if __name__ == "__main__": p = Process(target=count_sheeps, args=(5,)) p.daemon = True p.start() print("Let's just forget about it and quit here and now.") exit() 

在Linux下,你可以fork但这不会在Windows上工作。 我认为最简单的方法就是运行一个新的Python进程,把count_sheeps放在一个单独的文件中,并把count_sheeps Popen('python count_sheeps.py')

您可以始终启动一个新线程,并在调用start()方法之前调用myNewThread.daemon(True)。

当主进程退出时,该线程将继续运行。