[英]Control running Python Process (multiprocessing)
我還有一個關於Python多處理的問題。 我有一個模塊,它創建一個Process並在True True循環中運行。 該模塊旨在從另一個Python模塊啟用/禁用。 該其他模塊將一次導入第一個模塊,並且也將作為一個進程運行。
我該如何更好地實現呢?
所以作為參考:
#foo.py
def foo():
while True:
if enabled:
#do something
p = Process(target=foo)
p.start()
想象第二個模塊是這樣的:
#bar.py
import foo, time
def bar():
while True:
foo.enable()
time.sleep(10)
foo.disable()
Process(target=bar).start()
不斷地在循環內運行過程以檢查條件似乎是一種浪費,但是我很樂意接受只允許我從外部設置enabled
值的解決方案。 理想情況下,我希望能夠再次從該模塊外部終止並重新啟動該過程。 據我了解,我將使用隊列將命令傳遞給流程。 如果確實如此,那么有人可以告訴我如何設置它,以便可以從其他模塊向隊列中添加內容。
可以使用Python輕松做到這一點嗎?還是該放棄希望而改用C或Java之類的東西了
我在評論中打算使用兩種不同的方法:
multiprocessing.Value
的共享變量 def target_process_1(run_statement):
while True:
if run_statement.value:
print "I'm running !"
time.sleep(1)
def target_process_2(run_statement):
time.sleep(3)
print "Stoping"
run_statement.value = False
time.sleep(3)
print "Resuming"
run_statement.value = True
if __name__ == "__main__":
run_statement = Value("i", 1)
process_1 = Process(target=target_process_1, args=(run_statement,))
process_2 = Process(target=target_process_2, args=(run_statement,))
process_1.start()
process_2.start()
time.sleep(8)
process_1.terminate()
process_2.terminate()
from multiprocessing import Process
import time
import os, signal
def target_process_1():
while True:
print "Running !"
time.sleep(1)
def target_process_2(target_pid):
time.sleep(3)
os.kill(target_pid, signal.SIGSTOP)
time.sleep(3)
os.kill(target_pid, signal.SIGCONT)
if __name__ == "__main__":
process_1 = Process(target=target_process_1)
process_1.start()
process_2 = Process(target=target_process_2, args=(process_1.pid,))
process_2.start()
time.sleep(8)
process_1.terminate()
process_2.terminate()
旁注:如果可能,請不要運行while True
。
編輯 :如果您想在兩個不同的文件中管理您的進程,假設您想通過共享變量來使用控件,這是一種方法。
# file foo.py
from multiprocessing import Value, Process
import time
__all__ = ['start', 'stop', 'pause', 'resume']
_statement = None
_process = None
def _target(run_statement):
""" Target of the foo's process """
while True:
if run_statement.value:
print "I'm running !"
time.sleep(1)
def start():
global _process, _statement
_statement = Value("i", 1)
_process = Process(target=_target, args=(_statement,))
_process.start()
def stop():
global _process, _statement
_process.terminate()
_statement, _process = None, _process
def enable():
_statement.value = True
def disable():
_statement.value = False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.