gpt4 book ai didi

python - 使用 ThreadPoolExecutor 时避免竞争条件

转载 作者:行者123 更新时间:2023-12-03 12:58:47 24 4
gpt4 key购买 nike

我有以下方法 concurrent_api_call_and_processing() ,它采用以下参数:

  • api_call:是对外部网站的 HTTP 请求,用于检索和
    XLM 文档
  • lst:是 api_call
  • 所需的整数(id)列表
  • callback_processing:是一个本地方法,只解析每个 XLM
    请求

  • 我使用 api_call() 执行了大约 500 个 HTTP 请求,每个 id 对应一个 lst
    然后使用本地方法 callback_processing() 处理每个响应,该方法解析 XLM 并返回一个元组

    def concurrent_api_call_and_processing(api_call=None, callback_processing=None, lst=None, workers=5):
    """
    :param api_call: Function that will be called concurrently. An API call to API_Provider for each entry.
    : param lst: List of finding's ids needed by the API function to call API_Provider endpoint.
    :param callback_processing: Function that will be called after we get the response from the above API call.
    : param workers: Number of concurrent threads that will be used.
    :return: array of tuples containing the details of each particular finding.
    """

    output = Queue()
    with ThreadPoolExecutor(max_workers=workers) as executor:
    future_to_f_detail = {executor.submit(api_call, id): id for id in lst}
    for future in as_completed(future_to_f_detail):
    try:
    find_details = future.result()
    except Exception as exc:
    print(f"Finding {id} generated and exception: {exc}")
    else:
    f_det = callback_processing(find_details)
    output.put(f_det)
    return output

    在使用这种方法时,我开始注意到一些随机问题(不是正常终止)。

    由于我使用的是数组而不是队列( output=[] ),但我怀疑我是否可以有竞争条件,因此我决定重构代码并开始使用 Queue ( output=Queue )

    我的问题是:
  • 我的代码,就像现在一样,没有竞争条件吗?

  • 注意:我想注意以下 Raymond Hettinger, Keynote on Concurrency, PyBay 2017 , 我加了 fuzz()用于测试的 sleep 方法,但无法确定我是否确实存在竞争状况。

    最佳答案

    我认为没有足够的信息来确定这一点。

    考虑如果您传入 api_call 会发生什么增加全局变量的函数:

    count = 0
    def api_call_fn():
    global count
    count += 1

    当它被并发执行时,它会有一个竞争条件递增 count多变的。
    callback_processing 也是如此功能。

    为了审核此代码是否无竞争条件,我们必须查看这两个函数的定义:)

    关于python - 使用 ThreadPoolExecutor 时避免竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60048835/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com