繁体   English   中英

在 python 中使用多处理返回值

[英]Using multiprocessing in python to return values

背景

我现在有一些看起来像这样的代码。

failed_player_ids: Set[str] = set()
for player_id in player_ids:
    success = player_api.send_results(
        player_id, user=user, send_health_results=True
    )
    if not success:
        failed_player_ids.add(player_id)

此代码运行良好,但问题是每次调用需要 5 秒。 每分钟有 2000 个呼叫的速率限制,所以我远远低于最大容量。 我想并行化它以加快速度。 这是我第一次在 python 中使用multiprocessing库,因此我对应该如何进行有点困惑。 我可以用语言描述我想做什么。

在我当前的代码中,我循环播放player_id列表,如果 api 响应成功,我什么也不做,如果失败,我记下该播放器 ID。

我不确定如何实现此代码的并行版本。 我有一些想法,但我有点困惑。

这就是我到目前为止的想法

from multiprocessing import Pool


    
    num_processors_to_use = 5 # This is a number can be increased to get more speed
    
    def send_player_result(player_id_list: List[str]) -> Optional[str]:
        for player_id in player_id_list:
            success = player_api.send_results(player_id, user=user, send_health_results=True)
            if not success:
                return player_id
    # Caller
    with Pool(processes=num_processors_to_use) as pool:
            responses = pool.map(
                func=send_player_result,
                iterable=player_id_list,
            )
            failed_player_ids = Set(responses)

 

任何意见和建议都会有所帮助。

如果您使用的是 function map ,则可迭代player_id_list的每个项目将作为单独的任务传递给 function send_player_result 因此,这个 function 应该不再期望传递玩家 ID 列表,而是单个玩家 ID。 而且,正如您现在所知道的,如果您的任务主要受 I/O 限制,那么多线程是更好的 model。 您可以:

from multiprocessing.dummy import Pool
# or
from multiprocessing.pool import ThreadPool

您可能希望大大增加线程数(但不大于player_id_list的大小):

#from multiprocessing import Pool
from multiprocessing.dummy import Pool
from typing import Set

def send_player_result(player_id):
    success = player_api.send_results(player_id, user=user, send_health_results=True)
    return success

# Only required for Windows if you are doing multiprocessing:
if __name__ == '__main__':
    
    pool_size = 5 # This is a number can be increased to get more concurrency
    
    # Caller
    failed_player_ids: Set[str] = set()
    with Pool(pool_size) as pool:
        results = pool.map(func=send_player_result, iterable=player_id_list)
        for idx, success in enumerate(results):
            if not success:
                # failed for argument player_id_list[idx]:
                failed_player_ids.add(player_id_list[idx])
            

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM