在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代码的过程,所以我想利用它而不是黑客攻击操作系统。此外,如果相同的代码在Python所处的任何地方都有效,那将是非常棒的,而不仅仅是在Windows上。
答案 0 :(得分: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()
来获得你想要的行为。我从来没有使用过这种方法(并且直到一分钟才知道它的存在!),所以一定要告诉我们它是否适合你。
答案 1 :(得分:3)
您可以使用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()
答案 2 :(得分:1)
在Linux下你可以fork
,但这不适用于Windows。我认为最简单的方法是运行一个新的Python流程,将count_sheeps
放在一个单独的文件中Popen('python count_sheeps.py')
答案 3 :(得分:1)
如果您必须使它与Process
一起使用,这是一个肮脏的hack。基本上,您只需要覆盖join
,以便在脚本存在之前调用它
from multiprocessing import Process
import time
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
time.sleep(3)
print('hello', name)
class EverLastingProcess(Process):
def join(self, *args, **kwargs):
pass
def __del__(self):
pass
if __name__ == '__main__':
info('main line')
p = EverLastingProcess(target=f, args=('bob',), daemon=False)
p.start()
时,它只会执行阻塞操作。
obj.slow_attr()
答案 4 :(得分:0)
我尝试从 tkinter 窗口启动一个 pygame 窗口,然后关闭 tkinter 窗口,结果意外发现:
game = Game(env)
root.withdraw()
game.start()
exit()
不知道它是否有意,但它做我想要的。 (游戏源自 Process。)
答案 5 :(得分:-2)
你总是可以启动一个新线程,并在调用它的start()方法之前调用myNewThread.daemon(True)。
当主进程退出时,该线程将继续运行。