控制运行Python进程(多进程)
Control running Python Process (multiprocessing)
我还有一个关于 Python 多处理的问题。
我有一个创建进程的模块,只是 运行s 在 while True 循环中。
这个模块应该是来自另一个 Python 模块的 enabled/disabled。
另一个模块将导入第一个模块一次,并且也是 运行 作为一个进程。
我如何更好地实施它?
所以供参考:
#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
我还有一个关于 Python 多处理的问题。 我有一个创建进程的模块,只是 运行s 在 while True 循环中。 这个模块应该是来自另一个 Python 模块的 enabled/disabled。 另一个模块将导入第一个模块一次,并且也是 运行 作为一个进程。
我如何更好地实施它?
所以供参考:
#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