如何使用多处理模块杀死进程?

2024-03-24

我有一个进程本质上只是一个无限循环,我有第二个进程是一个计时器。定时器完成后如何终止循环进程?

def action():
  x = 0
  while True:
      if x < 1000000:
          x = x + 1
      else:
          x = 0

def timer(time):
  time.sleep(time)
  exit()    

loop_process = multiprocessing.Process(target=action)
loop_process.start()
timer_process = multiprocessing.Process(target=timer, args=(time,))
timer_process.start()

我希望 python 脚本在计时器完成后结束。


我认为你不需要仅仅为了计时器而创建第二个进程。

优雅的超时

如果您在退出前需要清理action过程中,您可以使用Timer-thread 并让 while 循环检查它是否仍然存在。这允许您的工作进程正常退出,但您将不得不付出性能下降的代价 因为重复的方法调用需要一些时间。不过,如果不是紧密循环,则不一定是问题。

from multiprocessing import Process
from datetime import datetime
from threading import Timer


def action(runtime, x=0):
    timer = Timer(runtime, lambda: None)  # just returns None on timeout
    timer.start()
    while timer.is_alive():
        if x < 1_000_000_000:
            x += 1
        else:
            x = 0

if __name__ == '__main__':

    RUNTIME = 1

    p = Process(target=action, args=(RUNTIME,))
    p.start()
    print(f'{datetime.now()} {p.name} started')
    p.join()
    print(f'{datetime.now()} {p.name} ended')

示例输出:

2019-02-28 19:18:54.731207 Process-1 started
2019-02-28 19:18:55.738308 Process-1 ended

超时终止

如果您不需要clean关闭(您没有使用共享队列、使用数据库等),您可以让父进程terminate()在您指定的时间之后工作进程。

终止()

终止该进程。在 Unix 上,这是使用 SIGTERM 信号完成的;在 Windows 上使用 TerminateProcess()。请注意,退出处理程序和finally 子句等将不会被执行。

请注意,该进程的后代进程不会被终止——它们只会成为孤立进程。

警告 如果在关联进程正在使用管道或队列时使用此方法,则管道或队列可能会损坏并且可能无法被其他进程使用。类似地,如果进程已获取锁或信号量等,则终止它可能会导致其他进程死锁。docs https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.Process.terminate

如果你在父母那里没有什么可做的,你可以简单地.join(timeout)工作进程和.terminate()然后。

from multiprocessing import Process
from datetime import datetime

def action(x=0):
    while True:
        if x < 1_000_000_000:
            x += 1
        else:
            x = 0

if __name__ == '__main__':

    RUNTIME = 1

    p = Process(target=action)
    p.start()
    print(f'{datetime.now()} {p.name} started')
    p.join(RUNTIME)
    p.terminate()
    print(f'{datetime.now()} {p.name} terminated')

示例输出:

2019-02-28 19:22:43.705596 Process-1 started
2019-02-28 19:22:44.709255 Process-1 terminated

如果你想使用terminate(),但需要您的父母解锁,您也可以使用Timer- 父级内的线程。

from multiprocessing import Process
from datetime import datetime
from threading import Timer

def action(x=0):
    while True:
        if x < 1_000_000_000:
            x += 1
        else:
            x = 0


def timeout(process, timeout):
    timer = Timer(timeout, process.terminate)
    timer.start()


if __name__ == '__main__':

    RUNTIME = 1

    p = Process(target=action)
    p.start()
    print(f'{datetime.now()} {p.name} started')
    timeout(p, RUNTIME)
    p.join()
    print(f'{datetime.now()} {p.name} terminated')

示例输出:

2019-02-28 19:23:45.776951 Process-1 started
2019-02-28 19:23:46.778840 Process-1 terminated
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用多处理模块杀死进程? 的相关文章

随机推荐

  • 使用标准 Gmail 应用程序发送电子邮件,无需选择器

    我正在尝试使用标准 Gmail 应用程序从我的应用程序发送电子邮件 但我总是有选择器 如何在没有选择器的情况下立即打开标准 Gmail 应用程序 我不需要任何可以发送电子邮件的应用程序的选择器 我只需要 GMAIL 谢谢你 这是我的代码 I
  • 中间操作和终端操作有什么区别?

    有人可以告诉我中间操作和终端操作有什么区别Stream Stream操作被组合到管道中来处理流 所有操作要么是中间操作 要么是最终操作 意味着 一个Stream支持多种操作 这些操作分为intermediate and terminal运营
  • 如何使用 Spring-Data-MongoDB 在实体中设置 @TextIndex 名称

    我有一个实体Person 继承于Musician and 政治家和一个存储库 PersonRepository 我试图使用 PersonRepository save 默认方法将所有三个实体保存到 MongoDB 中的集合 person 中
  • CustomKeyBoardExtension 中的当前文本选择

    我正在尝试写Custom Keyboard Extension 我正在寻找知道光标在哪里的方法UITextField UITextView 等等自定义键盘扩展 但我没有看到类似的东西 我看到了 SwiftKey 应用程序 http swif
  • 如何使用样式数据绑定?

    我在 KnockoutJS 中使用样式绑定时遇到困难 div div 渲染该模板
  • 从 C# 调用批处理文件

    我希望这是一个简单的问题 但我的 C 应用程序中有以下代码 由于某种原因 它不会执行我指向的批处理文件 private void filesystemwatcher Renamed object sender System IO Renam
  • 通过 javac 使用多个 .jar

    请原谅我的术语 我正在尝试将三个 jar 文件与 java 程序一起用于我的 CS 课程 第一个是funjava 一种简化的java语言 其他的是类定义颜色和几何 这是我的代码以及当我尝试运行它时会发生什么 import colors cl
  • Ruby 中的 preg_match_all 和 preg_replace

    我正在从 php 过渡到 ruby 我试图找出 ruby 中 php 命令 preg match all 和 preg replace 的同源 太感谢了 Ruby 中的等价物preg match all is String scan htt
  • 解析具有已知结构和重复元素的 XML 文件

    我正在尝试从包含大量具有重复名称的元素的 XML 文件中解析信息 以下是我尝试解析的文件类型的示例 仅包含一条记录
  • Linq to Xml:异常 - ' ' 字符(十六进制值 0x20)不能包含在名称中

    这是我的带有实体的实体类 Table Name CLINICAL ITEM MASTER public class ClinicalItemMaster Column public int CLIENT INPUT MHS ID get s
  • 如何使 F# 脚本文件和其他脚本语言在 Windows 中像 .exe、.cmd 和 .bat 文件一样工作

    可以配置 F 脚本文件 以便可以直接调用它们 而无需直接指定脚本运行程序应用程序及其文件扩展名 并且可以通过命令 PATH 环境变量进行访问 操作步骤如下 使用 Windows 资源管理器将特定脚本引擎设置为脚本文件类型扩展名的默认 打开方
  • CDI @Produces 具有多个属性文件

    感谢这篇文章 https stackoverflow com a 28047512 1227941 https stackoverflow com a 28047512 1227941我现在使用 CDI 使 msg 在我的 Named be
  • 在 C# windows 服务中捕获键盘事件

    我用 C 创建了一个 Windows 服务 如何在按下某个键时调用一个函数 并在该函数中获取该键的值 我需要它来按下键和按下键 我的目标是在按下特定系列的键时发送电子邮件 例如 如果您按 h e l l o 无论您在桌面上的哪个位置键入 程
  • TFS 2017 发布管理:如何显示发布下任务的父 PBI

    有没有办法在 TFS2017 下的列表中显示发布下的任务工作项的父 PBI The screenshot below shows two tasks associated with Release 3 Here I wish to be a
  • cipher 中 update() 和 dofinal() 方法之间的区别

    我读过一篇关于密码中 update 和 dofinal 方法之间差异的文章 这是关于如果我们想要加密 4 字节数组 当密码的块大小为 8 字节 时会发生什么 如果我们在这里调用 update 它将返回 null 我的问题是 如果我们用 4
  • 使用 Maven 和 IntelliJ 在 tomcat 中运行应用程序

    如果不使用 maven 要从 Intellij IDE 在 tomcat 上运行应用程序 您所要做的就是创建一个工件和指向该工件的 tomcat 运行配置 这样您就可以看到 tomcat 输出 重新启动服务器等就在 IDE 中 现在使用ma
  • 过渡状态图 R

    我的数据看起来像这样 输出dput sequence data structure list Obs 1 13 Seq 1 structure c 1L 1L 1L 1L 2L 2L 2L 2L 2L 2L 3L 3L 3L Label c
  • 使用 FFMPEG 将音频(带有偏移量)添加到视频

    我有一个 10 分钟的视频和一个 50 分钟的音频 mp3 视频从音频第 500 秒开始 使用 FFMPEG 如何将音频添加到视频但指定500 秒音频偏移 以便他们同步 EDIT 在这个底部page http howto pages org
  • 灰度图像到 NumPy 数组进行傅里叶变换

    目前我正在使用 PIL 和 NumPy 我有一个彩色的png图像 我想要 以灰度读取 转换为 NumPy 数组 对阵列执行 FFT 显示图像 这就是我正在尝试的 在 IPython w pylab flag In 1 import Imag
  • 如何使用多处理模块杀死进程?

    我有一个进程本质上只是一个无限循环 我有第二个进程是一个计时器 定时器完成后如何终止循环进程 def action x 0 while True if x lt 1000000 x x 1 else x 0 def timer time t