【问题标题】:Control running Python Process (multiprocessing)控制运行 Python 进程(多处理)
【发布时间】:2015-08-05 11:03:17
【问题描述】:

我还有一个关于 Python 多处理的问题。 我有一个模块,它创建一个 Process 并在一个 while 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 之类的东西了

【问题讨论】:

标签: python python-multiprocessing


【解决方案1】:

我打算在评论中使用两种不同的方法:

  • 使用来自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

【讨论】:

  • 这是一个很好的解决方案,虽然我不确定如何在两个不同的文件中实现这一点
  • 谢谢!那么 bar.py 做了什么?是不是像导入 foo 然后使用 enable()、disable() 等一样简单?
  • bar.py 脚本与您的脚本几乎相同,只是您必须在程序中的某个位置运行foo.start(),然后才能使用foo.{dis|en}able()
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2021-02-24
  • 1970-01-01
  • 2020-03-04
  • 2022-01-05
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多