問題描述
我有一個(gè)名為 MyScript 的 Python 腳本(類似于 unix,基于 RHEL),它有兩個(gè)函數(shù),分別稱為 A 和 B.我希望它們?cè)诓煌莫?dú)立進(jìn)程中運(yùn)行(分離 B 和 A):
I have a python script (unix-like, based on RHEL), called MyScript, that has two functions, called A and B. I'd like them to run in different, independent processes (detach B and A):
- 啟動(dòng)腳本 MyScript
- 執(zhí)行函數(shù)A
- 生成一個(gè)新進(jìn)程,將數(shù)據(jù)從函數(shù) A 傳遞到 B
- 當(dāng)函數(shù) B 運(yùn)行時(shí),繼續(xù)函數(shù) A
- 當(dāng)函數(shù) A 完成時(shí),即使 B 仍在運(yùn)行,也要退出 MyScript
我認(rèn)為我應(yīng)該使用多處理來創(chuàng)建一個(gè)守護(hù)進(jìn)程,但是 documentation 表明這不是正確的用例.所以,我決定生成一個(gè)子進(jìn)程和 child^2 進(jìn)程(孩子的孩子),然后強(qiáng)制孩子終止.雖然這種解決方法似乎有效,但看起來真的很難看.
I thought I should use multiprocessing to create a daemon process, but the documentation suggests that's not the right usecase. So, I decided to spawn a child process and child^2 process (the child's child), and then force the child to terminate. While this workaround appears to work, it seems really ugly.
你能幫我讓它更 Pythonic 嗎?subprocess 模塊是否有可以對(duì)函數(shù)進(jìn)行操作的方法?示例代碼如下.
Can you help me make it more pythonic? Does the subprocess module have a method that will operate on a function? Sample code below.
import multiprocessing
import time
import sys
import os
def parent_child():
p = multiprocessing.current_process()
print 'Starting parent child:', p.name, p.pid
sys.stdout.flush()
cc = multiprocessing.Process(name='childchild', target=child_child)
cc.daemon = False
cc.start()
print 'Exiting parent child:', p.name, p.pid
sys.stdout.flush()
def child_child():
p = multiprocessing.current_process()
print 'Starting child child:', p.name, p.pid
sys.stdout.flush()
time.sleep(30)
print 'Exiting child child:', p.name, p.pid
sys.stdout.flush()
def main():
print 'starting main', os.getpid()
d = multiprocessing.Process(name='parentchild', target=parent_child)
d.daemon = False
d.start()
time.sleep(5)
d.terminate()
print 'exiting main', os.getpid()
main()
推薦答案
這只是原始代碼的隨機(jī)版本,它將功能移動(dòng)到單個(gè)調(diào)用 spawn_detached(callable)
.即使在程序退出后,它也會(huì)保持分離的進(jìn)程運(yùn)行:
Here is just a random version of your original code that moves the functionality into a single call spawn_detached(callable)
. It keeps the detached process running even after the program exits:
import time
import os
from multiprocessing import Process, current_process
def spawn_detached(callable):
p = _spawn_detached(0, callable)
# give the process a moment to set up
# and then kill the first child to detach
# the second.
time.sleep(.001)
p.terminate()
def _spawn_detached(count, callable):
count += 1
p = current_process()
print 'Process #%d: %s (%d)' % (count, p.name, p.pid)
if count < 2:
name = 'child'
elif count == 2:
name = callable.func_name
else:
# we should now be inside of our detached process
# so just call the function
return callable()
# otherwise, spawn another process, passing the counter as well
p = Process(name=name, target=_spawn_detached, args=(count, callable))
p.daemon = False
p.start()
return p
def operation():
""" Just some arbitrary function """
print "Entered detached process"
time.sleep(15)
print "Exiting detached process"
if __name__ == "__main__":
print 'starting main', os.getpid()
p = spawn_detached(operation)
print 'exiting main', os.getpid()
這篇關(guān)于故意在python中創(chuàng)建一個(gè)孤兒進(jìn)程的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!