問題描述
我有一個名為 MyScript 的 Python 腳本(類似于 unix,基于 RHEL),它有兩個函數,分別稱為 A 和 B.我希望它們在不同的獨立進程中運行(分離 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):
- 啟動腳本 MyScript
- 執行函數A
- 生成一個新進程,將數據從函數 A 傳遞到 B
- 當函數 B 運行時,繼續函數 A
- 當函數 A 完成時,即使 B 仍在運行,也要退出 MyScript
我認為我應該使用多處理來創建一個守護進程,但是 documentation 表明這不是正確的用例.所以,我決定生成一個子進程和 child^2 進程(孩子的孩子),然后強制孩子終止.雖然這種解決方法似乎有效,但看起來真的很難看.
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 模塊是否有可以對函數進行操作的方法?示例代碼如下.
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()
推薦答案
這只是原始代碼的隨機版本,它將功能移動到單個調用 spawn_detached(callable)
.即使在程序退出后,它也會保持分離的進程運行:
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()
這篇關于故意在python中創建一個孤兒進程的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!