Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用多处理模块杀死进程?

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

Stack Overflow用户
提问于 2019-02-28 07:48:33
回答 3查看 3.7K关注 0票数 5

我有一个基本上是无限循环的过程,还有第二个进程,它是一个定时器。一旦计时器完成,我如何才能杀死循环进程?

代码语言:javascript
运行
AI代码解释
复制
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脚本结束。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-28 08:38:04

您可以通过使用进程之间共享状态并创建所有并发进程都可以访问的标志值(尽管这可能有点低效)来实现。

以下是我的建议:

代码语言:javascript
运行
AI代码解释
复制
import multiprocessing as mp
import time

def action(run_flag):
    x = 0
    while run_flag.value:
        if x < 1000000:
            x = x + 1
        else:
            x = 0

    print('action() terminating')


def timer(run_flag, secs):
    time.sleep(secs)
    run_flag.value = False


if __name__ == '__main__':

    run_flag = mp.Value('I', True)

    loop_process = mp.Process(target=action, args=(run_flag,))
    loop_process.start()

    timer_process = mp.Process(target=timer, args=(run_flag, 2.0))
    timer_process.start()

    loop_process.join()
    timer_process.join()

    print('done')
票数 1
EN

Stack Overflow用户

发布于 2019-02-28 08:01:46

else之后,action()中的一个简单的返回语句将完美地工作。此外,您的timer函数中有一个错误。您的论点与内置库时间具有相同的名称。

代码语言:javascript
运行
AI代码解释
复制
def action():
   x = 0
   while True:
      if x < 1000000:
         x = x + 1
      else:
         x = 0
         return # To exit else it will always revolve in infinite loop

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

loop_process = multiprocessing.Process(target=action)
loop_process.start()
timer_process = multiprocessing.Process(target=timer(10))
timer_process.start()

希望这能回答你的问题!

票数 1
EN

Stack Overflow用户

发布于 2019-02-28 11:18:46

我认为你不需要为计时器做第二个过程。

优美超时

如果您需要在退出action进程之前进行清理,您可以使用Timer-thread并让while循环检查它是否仍然有效。这允许您的工作进程优雅地退出,但是您将不得不降低性能,因为重复的方法调用需要一些时间。不过,如果不是一个严格的循环,那就不一定是个问题。

代码语言:javascript
运行
AI代码解释
复制
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')

示例输出:

代码语言:javascript
运行
AI代码解释
复制
2019-02-28 19:18:54.731207 Process-1 started
2019-02-28 19:18:55.738308 Process-1 ended

超时终止

如果您不需要彻底关闭(您没有使用共享队列,使用DBs等),那么可以让父进程在指定的时间后对工作进程进行terminate()

终止() 终止进程。在Unix上,这是使用SIGTERM信号完成的;在Windows上使用TerminateProcess()。请注意,退出处理程序和finally子句等不会被执行。 请注意,进程的后代进程不会终止--它们将成为孤儿。 警告如果在关联进程使用管道或队列时使用此方法,则管道或队列可能会损坏,其他进程可能无法使用。类似地,如果进程获得了锁或信号量等,则终止它可能会导致其他进程陷入死锁。文档

如果您在父进程中没有任何事情要做,那么您可以简单地对工作进程进行.join(timeout),然后再使用.terminate()

代码语言:javascript
运行
AI代码解释
复制
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')

示例输出:

代码语言:javascript
运行
AI代码解释
复制
2019-02-28 19:22:43.705596 Process-1 started
2019-02-28 19:22:44.709255 Process-1 terminated

如果您想使用terminate(),但需要您的父级解除阻塞,您也可以在父级中使用Timer-thread。

代码语言:javascript
运行
AI代码解释
复制
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')

示例输出:

代码语言:javascript
运行
AI代码解释
复制
2019-02-28 19:23:45.776951 Process-1 started
2019-02-28 19:23:46.778840 Process-1 terminated
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54929482

复制
相关文章
【(图) 旅游规划 (25 分)】【Dijkstra算法】
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 500; const int INF = 0x3f3f3f3f; struct Road { int _len; int _cost; }road[maxn][maxn]; int vis[maxn]; struct City { int _len; in
_DIY
2019/09/29
3020
【(图) 旅游规划 (25 分)】【Dijkstra算法】
【图】Dijkstra算法
正文之前 好久没弄C++了,上学期颓废了半学期,这学期开学就搞课程设计快疯了。待会要考试CSP,所以弄点代码储备,待会到了考场说不定能省点功夫! 正文 #include<iostream> usin
用户1687088
2018/07/24
1.1K0
【图】Dijkstra算法
图算法|Dijkstra算法python实现
01 — Dijkstra算法的理论部分 关于Dijkstra算法的原理部分,请参考之前的推送: 图算法|Dijkstra最短路径算法 Dijkstra算法总结如下: 1. 此算法是计算从入度为0的起始点开始的单源最短路径算法,它能计算从源点到图中任何一点的最短路径,假定起始点为A 2. 选取一个中心点center,是S集合中的最后一个元素,注意起始点到这个点的最短距离已经计算出来,并存储在dist字典中了。 3. 因为已经求出了从A->center的最短路径,所以每次迭代只需要找出center->{有关
double
2018/04/02
3.3K0
图算法|Dijkstra算法python实现
图算法|Dijkstra最短路径算法
01 — 单源最短路径 首先解释什么是单源最短路径,所谓单源最短路径就是指定一个出发顶点,计算从该源点出发到其他所有顶点的最短路径。如下图所示,如果源点设为A,那么单源最短路径问题,就是求解从A到B,
double
2018/04/02
6.4K0
图算法|Dijkstra最短路径算法
Dijkstra双栈表达式求值算法
以表达式"(1+((2+3)*(4*5)))"为例: 算法分四个步骤: 将操作数压入操作数栈 将运算符压入运算符栈 忽略左括号 在遇到右括号时,弹出一个运算符并弹出所需数量的操作数,运算结果并将结果压入操作数栈 处理完最后一个右括号后,操作数栈中只剩下一个数,就是表达式的值。 public class expression { public static void main(String[] args) { Stack<Character> ops = new Stack<Character>();/
SuperHeroes
2018/05/30
6470
图算法之bfs、dfs、prim、Dijkstra
概述 在图算法中经常要执行遍历每个顶点和每条边的操作,即图搜索。许多图算法都以图搜索为基础,如2-着色问题、连通性计算基于深度优先搜寻(depth-first search, DFS),而无权最短路径则基于广度优先搜索(breadth-first search, BFS)。基于搜索的算法还包括计算最小生成树的Prim算法以及计算最短路径的Dijkstra算法。图实现算法在现实的算法结构中占据重要的部分。 图 图的定义 图G是由顶点的有穷集合,以及顶点之间的关系组成,顶点的集合记为V,顶点之间的关系构成边的集
xiangzhihong
2018/02/06
2.9K0
图算法之bfs、dfs、prim、Dijkstra
Dijkstra算法
nx.info: [1, 2, 3, 4, 6, 7, 8, 9, 10, 11] 顶点 v1 到 顶点 v11 的最短加权路径: [1, 2, 3, 7, 10, 9, 11] 顶点 v1 到 顶点 v11 的最短加权路径长度: 9
裴来凡
2022/05/29
4150
Dijkstra算法
有趣的算法(五) ——Dijkstra双栈四则运算
有趣的算法(五)——Dijkstra双栈四则运算 (原创内容,转载请注明来源,谢谢) 一、概念 近期看到算法书上,提到dijkstra双栈的方法,实现输入一个四则运算的字符串,输出结果。 其实质上,就是利用两个栈,一个存储数字,一个存储运算符,再通过括号进行判定是否需要取出内容。 二、分析 为方便说明,现假设运算的字符串为(3*(8-2))。其中,为简化算法,假定每两个数的运算都要加上括号(对于不加括号的算法,后面会讨论到)。 运算的过程如下: 1)初始化两个栈,分别用于存放运算
用户1327360
2018/03/07
2K0
Dijkstra算法
Dijkstra算法使用了广度优先搜索解决赋权有向图(或无向图)的单源最短路径问题。
mwangblog
2019/05/16
1.1K0
Dijkstra算法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其它全部节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但因为它遍历计算的节点非常多,所以效率低。
全栈程序员站长
2021/12/05
4600
dijkstra算法原理是什么?dijkstra算法的缺点是什么?
dijkstra算法也被称为狄克斯特拉算法,是由一个名为狄克斯特拉的荷兰科学家提出的,这种算法是计算从一个顶点到其他各个顶点的最短路径,虽然看上去很抽象,但是在实际生活中应用非常广泛,比如在网络中寻找路由器的最短路径就是通过该种算法实现的。那么dijkstra算法原理是什么?dijkstra算法的缺点是什么?
用户8739990
2021/06/25
8.7K0
Dijkstra 算法的 python 实现
离散课上图论的时候讲了理论知识,但是还没实践过,于是拿python写了一下,顺便做个笔记防止忘记。
赤道企鹅
2022/08/01
7510
漫画:Dijkstra 算法的优化
在上一篇漫画中,小灰介绍了单源最短路径算法 Dijkstra,没看过的小伙伴可以看下:
小灰
2020/04/22
5940
带权二分图最优匹配(KM)
KM算法是在匈牙利算法的基础上衍生,在二分图匹配的问题上增加权重,变成了一个带权二分图匹配问题,求最优的二分图匹配。
AngelNH
2020/04/16
4.2K0
dijkstra算法python实现
MAX_value = 999999 def dijkstra(graph, s): # 判断图是否为空,如果为空直接退出 if graph is None: return None dist = [MAX_value]*len(graph) dist[s] = 0 S = [] Q = [i for i in range(len(graph))] dist_init = [i for i in graph[s]] whil
py3study
2020/01/06
8150
dijkstra算法python实现
Dijkstra算法例子
%d 输出 向量 路径长度,若t==[],则返回从起点到所有节点的路径长度
mwangblog
2019/05/16
9270
图论--Dijkstra算法总结
1.BFS转换Dijkstra: 对于一些路径的的问题及一些特殊的搜索题目,如果数据量很多但是处理边的复杂程度可以接受,就是说我们可以通过操作将原来要搜索的问题转化为Dijkstra能做的问题,这样可以提高效率,虽然介于BFS与Dijkstra之间有着A*,但是A*的题目我目前就看到了一类,第K短路,常用的还是转换。举个例子:在一个城堡中,有机关陷阱并且告知了其坐标,设城堡为一个二维平面,若这个二维有10000点,BFS最坏的情况是O(V^2)那么可能会超时,那么我们考虑,将每个点的作为节点建图,若有机关则他与上下左右都不连通,其他的每个点建立四联通边,那么时间复杂度为O(4*V),再加上Dijkstra为O(4*V+VlogV)可以将其解出,这个例子可能不太恰当,但是在这里给出解题的思想,BFS与Dijkstra同是单源最短路是可以转化的。
风骨散人Chiam
2020/10/28
7130
加权有向图----单点最短路径问题(Dijkstra算法)
单点最短路径问题是求解从s到给定顶点v之间总权重最小的那条路径的问题。Dijkstra算法可以解决边的权重非负的最短路径问题。 Dijkstra算法无法判断含负权边的图的最短路径,但Bellman-Ford算法可以。 在实现Dijkstra算法之前,必须先了解边的松弛: 松弛边v->w意味着检查从s到w的最短路径是否是先从s到v,再从v到w。如果是,则根据这个情况更新数据。下面的代码实现了放松一个从给定顶点的指出的所有的边: private void relax(EdgeWeightedDigraph G,
SuperHeroes
2018/05/30
2.5K0
Dijkstra的最短路径算法
给定图中的图形和源顶点,找到给定图形中从源到所有顶点的最短路径。 Dijkstra的算法与最小生成树的Prim算法非常相似。与Prim的MST一样,我们以给定的源为根生成SPT(最短路径树)。我们维护两组,一组包含最短路径树中包含的顶点,另一组包括最短路径树中尚未包括的顶点。在算法的每个步骤中,我们找到一个顶点,该顶点位于另一个集合中(尚未包括的集合)并且与源具有最小距离。
全栈程序员站长
2022/08/28
1.2K0
Dijkstra的最短路径算法
会一会改变世界的图算法——Dijkstra(狄克斯特拉)算法
狄克斯特拉算法是非常著名的算法,是改变世界的十大算法之一,用于解决【赋权】【有向无环图】的【单源最短路径】问题。
掘金安东尼
2022/09/22
1.1K0
会一会改变世界的图算法——Dijkstra(狄克斯特拉)算法

相似问题

Mediaelement.js在IE上倒带后隐藏控件

10

如果视频=持续时间停止和倒带

20

在电影XNA结束时停止视频播放

12

MediaElement.js (WordPress)设置YouTube视频的结束时间

116

在mediaelement.js中播放FLV视频

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档