当前位置: 首页 > 面试题库 >

Python多处理模块:超时连接过程

黄浩涆
2023-03-14
问题内容

我正在优化复杂模拟的参数。我使用多处理模块来增强优化算法的性能。我在http://pymotw.com/2/multiprocessing/basics.html上了解了多处理的基础知识。复杂的模拟根据优化算法中给定的参数持续不同的时间,大约1到5分钟。如果参数选择不正确,则模拟可能会持续30分钟或更长时间,结果将无用。因此,我正在考虑为多处理建立超时,该超时将终止所有持续超过定义时间的模拟。这是问题的抽象版本:

import numpy as np
import time
import multiprocessing

def worker(num):

    time.sleep(np.random.random()*20)

def main():

    pnum = 10

    procs = []
    for i in range(pnum):
        p = multiprocessing.Process(target=worker, args=(i,), name = ('process_' + str(i+1)))
        procs.append(p)
        p.start()
        print 'starting', p.name

    for p in procs:
        p.join(5)
        print 'stopping', p.name

if __name__ == "__main__":
    main()

该行p.join(5)定义了5秒的超时时间。由于for循环for p in procs:,程序等待5秒钟直到第一个进程完成,然后再等待5秒钟直到第二个进程完成,依此类推,但是我希望程序终止所有持续5秒钟以上的进程。此外,如果所有进程的持续时间都不超过5秒,则程序不得等待这5秒。


问题答案:

您可以通过创建一个循环来完成此操作,该循环将等待一些超时时间,并经常检查所有进程是否已完成。如果它们还没有在指定的时间内完成,请终止所有过程:

TIMEOUT = 5 
start = time.time()
while time.time() - start <= TIMEOUT:
    if not any(p.is_alive() for p in procs):
        # All the processes are done, break now.
        break

    time.sleep(.1)  # Just to avoid hogging the CPU
else:
    # We only enter this if we didn't 'break' above.
    print("timed out, killing all processes")
    for p in procs:
        p.terminate()
        p.join()


 类似资料:
  • 问题内容: 我想使用multiprocessing.Pool,但是multiprocessing.Pool不能在超时后中止任务。我找到了解决方案,并对其进行了一些修改。 主要修改-使用 sys.exit(1) 退出工作进程。它杀死了工作进程并杀死了工作线程,但是我不确定这个解决方案是否很好。当进程因正在运行的作业而终止时,我会遇到哪些潜在的问题? 问题答案: 停止正在运行的作业没有隐含的风险,操作

  • 本文向大家介绍Python socket处理client连接过程解析,包括了Python socket处理client连接过程解析的使用技巧和注意事项,需要的朋友参考一下 socket只能处理一个client连接,如果需要并发处理多个链接则需要使用socketserver,下面是代码示例以及注释 server端 下面是client端 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多

  • 本文档描述了什么是多路处理模块以及它如何为Apache所使用。 简介 Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。不同的平台和不同的环境经常产生不同的需求,或是为了达到同样的最佳效果而采用不同的方法。Apache凭借它的模块化设计很好的适应了大量不同的环境。这一设计使得网站管理员能够在编译时和运行时凭借载入不同的模块来决定服务器的不同附加功能。

  • 问题内容: 我正在urllib2的urlopen中使用timeout参数。 我如何告诉Python,如果超时到期,应该引发自定义错误? 有任何想法吗? 问题答案: 在极少数情况下要使用。这样做会捕获可能很难调试的 任何 异常,并且会捕获包括和在内的异常,这些异常会使您的程序恼人。 最简单的说,您会发现: 以下内容应捕获连接超时时引发的特定错误:

  • 问题内容: 我使用python连接到mysql数据库 。我编写的程序需要花费大量时间才能完全执行,即大约需要10个小时。实际上,我正在尝试从语料库中读取不同的词。读取完成后,出现超时错误。 我检查了Mysql默认超时是: 如何更改默认超时? 问题答案: 做: 参数含义(取自Navigator中的MySQL Workbench:实例>选项文件>选项卡“网络”>“超时设置”部分) connect_ti

  • 在多模块Android项目中,注释处理仍然是在任何编译完成之前的第一个任务,然后触发完整的编译。当然,这是在进入< code>app模块之前按模块完成的。 想象一下这样一种情况,一些子模块依赖于其他子模块,编译将会失败,因为依赖者还不能在它所依赖的模块中找到生成类的定义,仅仅因为它们还没有生成。 我想知道是否有一种方法可以使用<code>gradle</code>或任何其他方法强制执行所有子模块注