当前位置: 首页 > 知识库问答 >
问题:

控制运行Python进程(多处理)

越学博
2023-03-14

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

共有1个答案

柳修平
2023-03-14

我在评论中提出了两种不同的方法:

  • 使用来自的共享变量。值
  • 用信号暂停/恢复进程
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()

旁注:如果可能,在为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

 类似资料:
  • 主要内容:1. 主进程和工作进程,2. 控制NGINX本节介绍NGINX在运行时启动的过程以及如何控制它们。 在这个部分中,主要涉及两个部分的内容: 主进程和工作进程 控制NGINX 1. 主进程和工作进程 NGINX有一个主进程和一个或多个工作进程。 如果启用缓存,缓存加载程序和缓存管理器进程也将在启动时运行。 主程序的主要目的是读取和评估配置文件以及维护工作进程。 工作进程执行请求的实际处理。 NGINX依赖于操作系统的机制来有效地在工作进程之间

  • 我使用一个Runnable对象来运行processCommand并执行一些需要一定时间的处理(我们称之为insideprocess)。在insideprocess的末尾,它将向文本文件写入一些内容。其思想是,如果在指定的时间内insideprocess仍未完成,则必须将其杀死,因此我使用ExecutorService来处理它。但是如果insideprocess早于指定时间完成,它将中断Execut

  • 问题内容: 我正在学习如何使用Python多处理库。但是,当我浏览一些示例时,最终我在后台运行了许多python进程。 其中的例子看起来象下面这样: 现在,这是我的“ TOP”命令的屏幕截图: 我不知道如何一口气杀死他们。 ps … | grep python ....杀死吗? 我需要添加哪种python代码,以避免再次发生这种悲惨的情况。谢谢! 问题答案: 您需要在工作队列中处理您的进程,该进程

  • 问题内容: 如果对某些人来说这太简单了,我感到抱歉,但是我仍然不了解python的多处理技巧。我已经阅读了 http://docs.python.org/dev/library/multiprocessing http://pymotw.com/2/multiprocessing/basics.html 以及Google给我的许多其他教程和示例…其中许多从这里也是。 好吧,我的情况是我必须计算许多

  • 进展的相关属性和扩展管理 进程: 主进程, 渲染进程​ Electron 中的 process 对象是Node.js的process 对象 的扩展。 事件 事件: 'loaded' 触发:Electron加载其内部预置脚本并开始载入网页或主脚本时 当Node关闭时,预置脚本可以用loaded将 原本已删除的Node全局符号 重新添加回 全局范围: 1 // 预置脚本 2 const _setImm

  • fork 新建一个子进程。具有一次调用,两次返回的特点。 evecve 有6种表达: