在 Python 中使用多处理创建超时函数

2024-04-18

我正在尝试使用多处理库在 Python 2.7.11(在 Windows 上)中创建超时函数。

我的基本目标是,如果函数超时,则返回一个值;如果函数未超时,则返回实际值。

我的方法如下:

from multiprocessing import Process, Manager

def timeoutFunction(puzzleFileName, timeLimit):
  manager = Manager()
  returnVal = manager.list()

  # Create worker function
  def solveProblem(return_val):
    return_val[:] = doSomeWork(puzzleFileName) # doSomeWork() returns list

  p = Process(target=solveProblem, args=[returnVal])
  p.start()

  p.join(timeLimit)
  if p.is_alive():
    p.terminate()
    returnVal = ['Timeout']

  return returnVal

我这样调用该函数:

if __name__ == '__main__':
  print timeoutFunction('example.txt', 600)

不幸的是,这不起作用,我在 pickle.py 中收到某种 EOF 错误

谁能看到我做错了什么吗?

提前致谢,
亚历山大

Edit:doSomeWork() 不是一个实际的函数。只是我所做的其他一些工作的填充物。这项工作不是并行完成的,也不使用任何共享变量。我只想运行一个函数,并且可能会超时。


您可以使用Pebble https://pypi.python.org/pypi/Pebble为此的图书馆。

from pebble import concurrent
from concurrent.futures import TimeoutError

TIMEOUT_IN_SECONDS = 10

@concurrent.process(timeout=TIMEOUT_IN_SECONDS)
def function(foo, bar=0):
    return foo + bar

future = function(1, bar=2)

try:
    result = future.result()  # blocks until results are ready or timeout
except TimeoutError as error:
    print "Function took longer than %d seconds" % error.args[1]
    result = 'timeout'

The 文档 https://pebble.readthedocs.io有更完整的例子。

如果超时,库将终止该函数,因此您无需担心 IO 或 CPU 被浪费。

EDIT:

如果您正在做作业,您仍然可以查看its https://github.com/noxdafox/pebble执行。

简短的例子:

from multiprocessing import Pipe, Process

def worker(pipe, function, args, kwargs):
    try:
        results = function(*args, **kwargs)
    except Exception as error:
        results = error

    pipe.send(results)

pipe = Pipe(duplex=False)
process = Process(target=worker, args=(pipe, function, args, kwargs))

if pipe.poll(timeout=5):
    process.terminate()
    process.join()
    results = 'timeout'
else:
    results = pipe.recv()

Pebble 提供了简洁的 API,处理极端情况并使用更强大的机制。但这或多或少就是它在幕后所做的事情。

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

在 Python 中使用多处理创建超时函数 的相关文章

随机推荐

  • PHP call_user_func 与仅调用函数

    我确信对此有一个非常简单的解释 这有什么区别 function barber type echo You wanted a type haircut no problem n call user func barber mushroom c
  • MVC ASP.NET 地图路由不适用于表单 GET 请求

    In View using Html BeginForm PageName ControllerName FormMethod Get
  • 如何在 C++ 中创建内存泄漏?

    我只是想知道如何使用 C 创建系统内存泄漏 我对此进行了一些谷歌搜索 但没有得到太多结果 我知道在 C 中执行此操作实际上不太可行 因为它是托管代码 但想知道是否有一种简单的方法可以用 C 执行此操作 我只是觉得看看系统因代码编写不正确而受
  • Netbeans - 类没有 main 方法

    我的程序只是一个简单的 System out println 但是netbeans找不到main方法 netbeans 6 7 1和WIN7有冲突吗 有什么可能的错误吗 当您手动移动主类位置时会发生这种情况 因为 Netbeans 不会刷新
  • 如何有条件地跳过 Cucumber 中的场景?

    如何有条件地跳过场景 例如 我希望仅在满足某些条件时才继续某个场景 但如果不存在 我不希望将其注册为失败 这是我遇到的一个问题 我编写的测试是针对一个 UI 该 UI 具有不断变化的 BE 数据库 我目前无法在其中包含静态数据 这意味着有时
  • 在 javascript 中查找经过的时间

    我是 JavaScript 新手 我正在尝试编写一段代码来计算从用户登录到当前时间所经过的时间 这是我的代码 function markPresent window markDate new Date document ready func
  • /admin 处导入错误:没有名为 defaults 的模块

    我正在将我的网站从 django 1 4 升级到 django 1 6 但它一直出现以下错误 admin 处的 ImportError 没有名为 defaults 的模块 其他地方都说你应该这样做 from django conf urls
  • 如何在IIS7.5上Response.Write?

    我正在尝试写一个给客户的回复 response StatusCode int HttpStatusCode BadRequest response ClearContent response Write String Format CRLF
  • 在delphi中的“自定义”浏览器中修改requestHeaders

    我的 deplhi 应用程序 IE 中集成了一个浏览器 我需要调用某个 Web 应用程序 并且需要在标头中为来自应用程序浏览器的所有请求附加一个新变量 例如 jquery 添加到 xhrobjHTTP X REQUESTED WITH范围
  • 使用 jQuery 进行渐变填充?

    我有一个 div 需要渐变背景 然而 div 的大小是可变的 这让我又回到了 不能在 CSS 中做渐变 的境地 然而 我很确定这在 jQuery 中是可能的 我只是似乎找不到一个合适的例子 有人可以指点我的方向吗 Thanks 如果有人需要
  • 如何更新猫鼬嵌套数组文档[重复]

    这个问题在这里已经有答案了 我知道这个问题是重复的 但我不知道为什么我被困住了 Question 我怎样才能编辑 requirement update 数组文档 使用 find by id and requirement update id
  • 带有条件 isset 的 If 语句和比较不能一起工作

    我在制作时遇到问题if声明 code if detail variable exists and is equal to 1 code if detail variable doesn t exist or is not equal 1 由
  • 如何向 dateadd sql 添加小时、分钟、秒?

    我想要一个完整的约会 所以今天是 7 7 2010 12 00 00 am 到 7 7 2010 11 59 59 pm 所以这应该是完整的 24 小时 因为上午 12 00 00 就是 8 号 所以我有这个 select DATEADD
  • Python Pandas - 根据组中值的存在来过滤组

    我需要按一列对数据框进行分组 然后过滤掉另一列中不包含特定值的所有组 例如 这是我的数据框 A B 1 False 1 True 2 False 2 False 3 True 3 False 4 False 我想按 A 列进行分组 然后删除
  • 当我使用 asp.net 从 xml 文件写入/读取时保留回车符

    我有 TextBox 来获取用户的评论 评论将保存到 XML 文件中 问题是当我写一个文本有回车键 新行 时 它会以正确的方式保存到xml中 像这样
  • Interface-Builder:将 NSView 类与 .xib“组合”

    我想在 Interface Builder 中设置一个自定义 NSView 但我无法让它在 OSX 上工作 在我的 ViewController 的 xib 中 我添加了一个自定义视图并将类设置为 MyCustomView 我创建了 MyC
  • 将限制限定指针传递给函数?

    限制限定指针向我解释为有一个规则 任何由指针访问并在任何地方修改的对象只能由指针访问 那么下面的方法是行不通的 对吧 void agSum int restrict x int n for int i 0 i
  • 如何设置 pexpect ssh 会话的列宽?

    我正在编写一个简单的 python 脚本来通过 SSH 连接到 SAN 运行一组命令 最终 每个命令将与时间戳一起记录到单独的日志中 然后退出 这是因为我们连接的设备不支持证书 ssh 连接 并且当前固件版本没有良好的日志记录功能 我似乎遇
  • SAS Do 循环:在循环内使用循环变量来创建滞后变量

    我想创建包含给定变量的滞后值的变量 以实现大量滞后 我怎么能这样做呢 我尝试以下操作 data out set in do i 1 to 50 let j i lag j Lag j x end run 如何获取循环变量i进入宏变量j或者如
  • 在 Python 中使用多处理创建超时函数

    我正在尝试使用多处理库在 Python 2 7 11 在 Windows 上 中创建超时函数 我的基本目标是 如果函数超时 则返回一个值 如果函数未超时 则返回实际值 我的方法如下 from multiprocessing import P