2009-11-11 55 views
7

在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.Popen运行一个新的python解释器,并将其作为一个单独的脚本进行计数。

不过,有与Python代码的过程打这整个模块,所以我想利用这个优势,而不是黑客OS上的。另外,如果相同的代码可以在Python所在的任何地方工作,而不仅仅是在Windows上,那将会非常棒。

+0

在这里我通常会看到相反的问题。 – mob 2009-11-11 23:53:36

回答

4

使用subprocess模块作为其他子进程控制方法(使用os.system,os.spawn *,os.popen *,popen2 ,命令。)正在被弃用:

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

See the 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()来获得您想要的行为。我从来没有使用过这种方法(并且直到一分钟前才知道它的存在!),所以一定要让我们知道它是否适用于您。

+0

请不要'输入*'。 – 2009-11-12 00:09:15

+0

当然 - 删除导入* – 2009-11-12 00:11:33

+0

cancel_join_thread()似乎是为了别的东西:这样即使它使用的队列不是空的,进程也可以退出。 但是,除非在我的示例中有一些默默创建并填充的队列,否则我不认为这会对我有帮助。 – 2009-11-14 23:35:49

1

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

+0

同意 - 唯一的困难是编组参数的方法。 count_sheeps(number)很容易,其中“number”是一个整数。对于复杂的参数,multiprocessing.Process方法是一个聪明的方法! – 2009-11-12 00:36:28

+0

是的,这是可怜的叉不在Windows上。似乎我将不得不走这条路。 – 2009-11-14 23:29:34

-2

你总是可以启动一个新的线程,并调用它的启动之前调用myNewThread.daemon(真)()方法。

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

+0

谢谢,但不是真的。守护程序线程在主程序退出时被终止。 与非守护线程的区别在于程序只是将它们关闭而不是等待它们自行结束。 – 2009-11-14 23:27:46

+0

AFAICT守护进程线程正是原始问题所需要的。虽然守护进程线程没有保持运行,但在这个答案中这是不正确的。 – ketorin 2013-11-08 13:39:52

2

您可以使用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()