首页 > 编程问答 >Python (Pebble) - 超时功能。当 TimeoutError 发生时,获取从 iterable 传递给函数的值

Python (Pebble) - 超时功能。当 TimeoutError 发生时,获取从 iterable 传递给函数的值

时间:2024-07-26 04:16:10浏览次数:13  
标签:python python-3.x python-multiprocessing pebble

我正在尝试在 Pebble 中设置工作超时(基本上有效)

from pebble import ProcessPool
from multiprocessing import Process, Pool, cpu_count
import time

def test_fn(randomNumberFromList):
    # print(f'Beginnging for this number: {randomNumberFromList}')

        if randomNumberFromList in [1,66,3,88,5,777]:
            time.sleep(10)
            completion_state = [randomNumberFromList, True]
            return completion_state
        else:
            time.sleep(1)
            completion_state = [randomNumberFromList, True]
            return completion_state


def main(): 
    list1 = [1, 2, 3, 4, 5, 6, 20, 33, 55, 233, 44, 66, 2666, 555, 8888, 888, 88, 77, 777, 7777, 77777]
    with ProcessPool() as pool:
        future = pool.map(test_fn, list1, timeout=4)
        iterator = future.result()
        while True:
            try:
                result = next(iterator)
                print(result)
            except StopIteration:
                break
            except TimeoutError as error: 
                print(f'list1value took longer than {error.args[1]} seconds.')


if __name__ == "__main__":
    main()

但是,我无法在 TimeoutError 块内获取 list1 中的“失败”值。我该怎么做呢?对于这个例子,我想要“1花了超过4秒。”,“66花了超过4秒。”等等打印到控制台

翻遍了Pebble文档,没有看到这样的方法会给我带来价值


为了在发生 TimeoutError 时获取导致超时的 list1 中的值,你需要跟踪 ProcessPool 中每个 futures 的输入值。可以通过创建一个字典来实现,该字典将 futures 与其相应的输入值关联起来。

以下是更新后的代码:

from pebble import ProcessPool
from concurrent.futures import TimeoutError
import time

def test_fn(randomNumberFromList):
    # print(f'Beginnging for this number: {randomNumberFromList}')

    if randomNumberFromList in [1, 66, 3, 88, 5, 777]:
        time.sleep(10)
        completion_state = [randomNumberFromList, True]
        return completion_state
    else:
        time.sleep(1)
        completion_state = [randomNumberFromList, True]
        return completion_state


def main():
    list1 = [1, 2, 3, 4, 5, 6, 20, 33, 55, 233, 44, 66, 2666, 555, 8888, 888, 88, 77, 777, 7777, 77777]
    with ProcessPool() as pool:
        future_dict = {pool.schedule(test_fn, args=(num,)): num for num in list1}

        for future in future_dict:
            try:
                result = future.result(timeout=4)
                print(result)
            except TimeoutError:
                print(f'list1 value {future_dict[future]} took longer than 4 seconds.')


if __name__ == "__main__":
    main()

在这个更新后的代码中:

  1. 我们创建了一个字典 future_dict 来存储 futures 和它们对应的输入值。
  2. 我们迭代 future_dict 中的 futures,并使用 future.result(timeout=4) 来获取每个 future 的结果,并设置 4 秒的超时时间。
  3. 如果一个 future 超时,我们会在 TimeoutError 块中使用 future_dict[future] 来访问并打印导致超时的 list1 中的值。

这个修改将确保你在发生 TimeoutError 时可以识别出 list1 中导致超时的特定值。

标签:python,python-3.x,python-multiprocessing,pebble
From: 78790634

相关文章

  • 为什么在 Python 上使用正则表达式组功能会给出不同的输出
    importrestring1="aaabaa"zusuchen="aa"#1m_start=re.finditer(fr'(?=({zusuchen}))',string1)results=[(match.start(1),match.end(1)-1)formatchinm_start]forzinresults:print(z)print("Now#2:"......
  • 如何在python3中找到文件的长度?
    我的第一个.py:defcreate_file(file_name):list=["ab","cd","ef"]foriinlist:withopen(file_name,"a+")asinput_file:print("{}".format(i),file=input_file)我的第二个.py:fromfirstimport......
  • 哪种 python 日志记录风格是推荐的或标准的?
    我是Python新手。介于以下2个选项之间。对于python来说,推荐哪种风格或者更好?logging.info(f"Won'tsavemodelasscoreisbelow0,score:{score}")logging.info("Won'tsavemodelasscoreisbelow0,score%s",score)我个人更喜欢第二种方法。在Python......
  • python 协程 自定义互斥锁
    最近在用python的一款异步web框架sanic搭建web服务,遇到一个需要加特定锁的场景:同一用户并发处理订单时需要排队处理,但不同用户不需要排队。如果仅仅使用asyncwithasyncio.Lock()的话。会使所有请求都排队处理。1importasyncio2importdatetime34lock=asyncio.L......
  • Python 获取tiktok视频评论回复数据 api接口
    TIKTOKapi接口爬取tiktok视频评论回复数据详细采集页面如图https://www.tiktok.com/@dailymail/video/7329872821990182190?q=neural%20link&t=1706783508149请求APIhttp://api.xxxx.com/tt/video/info/comment/reply?video_id=7288909913185701125&comment_id=7294900......
  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......
  • python实现图像特征提取算法1
    python实现Marr-Hildreth算法、Canny边缘检测器算法1.Marr-Hildreth算法详解算法步骤公式Python实现详细解释优缺点2.Canny边缘检测器算法详解算法步骤公式Python实现详细解释优缺点1.Marr-Hildreth算法详解Marr-Hildreth算法是一个......
  • python实现盲反卷积算法
    python实现盲反卷积算法盲反卷积算法算法原理算法实现Python实现详细解释优缺点应用领域盲反卷积算法盲反卷积算法是一种图像复原技术,用于在没有先验知识或仅有有限信息的情况下,估计模糊图像的原始清晰图像和点扩散函数(PSF)。盲反卷积在摄影、医学成......
  • Python——异常捕获,传递及其抛出操作
    01.异常的概念1.程序在运行时,如果python解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常。2.程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常。 程序开发时,很难将所有的特殊情况都处理的面面俱到,通过异常捕获可以针对突发事件做......
  • Python 多进程下日志打印
    Python多进程下日志打印问题分析使用gunicorn启动Flask时,如果直接使用logging的RotatingFileHandler模块会出现日志混乱,甚至日志丢失的情况。在日志翻转时,可能出现一个进程将log文件翻转,而后又有进程也将log文件翻转,导致log.1文件并未达到设置的最大的文件大小,......