こんにちは。
非同期並列実行版 map
関数を、asyncio
を利用して作りました(下記ソース内の map_async
)。
動作確認
最大並列数(limit
)を 2 へ指定し、実行時間が 1/2 となることを確かめました。
ソース
test_asyncio.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import asyncio
def map_async(func, data, limit):
loop = asyncio.get_event_loop()
async def run_all():
sem = asyncio.Semaphore(limit)
async def run_each(d):
async with sem:
return await loop.run_in_executor(None, func, d)
return await asyncio.gather(*[run_each(d) for d in data])
return loop.run_until_complete(run_all()) # list
def map_async_test(data, limit):
def func_blocking(x):
import time
print(x)
time.sleep(x)
return x
print(map_async(func_blocking, data, limit))
# synchronous
# def map_sync_test(data):
# print(list(map(func_blocking, data)))
def main():
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--limit', type=int, default=2)
parser.add_argument('data', type=float, nargs='*')
args = parser.parse_args()
map_async_test(args.data, args.limit)
if __name__ == '__main__':
main()