ThreadPoolExecutorにdetection_asyncを渡すのが自然だと思います。
「外部のapiを呼ぶ」処理と「並列に実行する」処理を疎結合にしやすいからです。
具体例としては以下のようになります。
detection_async_parallel
が detection_async
の戻り値に依存していないのがおわかりいただけますか?
python
1import subprocess
2from concurrent.futures import ThreadPoolExecutor
3
4
5def detection_async(request):
6 image_path = get_path(request)
7 text_path = '/path/to/text'
8
9 # 下記、並列処理させたい。
10 result = subprocess.run(['tesseract', '--psm', '1', '--oem', '1', image_path, text_path], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
11
12 return result
13
14
15def detection_async_parallel(requests):
16 results = []
17 with ThreadPoolExecutor() as executor:
18 for result in executor.map(detection_async, requests):
19 results.append(result)
20 return results
21
22
23if __name__ == "__main__":
24 requests = [
25 'image_path1',
26 'image_path2',
27 'image_path3',
28 ]
29 for result in detection_async_parallel(requests):
30 print(result)
31
これをもしsubprocess.Popenだけで実装するなら、以下のようになります。
ThreadPoolExecutorを使うときと違って、detection_async_parallel
が detection_async
の戻り値に依存しています。
python
1def detection_async(request):
2 image_path = get_path(request)
3 text_path = '/path/to/text'
4
5 # 下記、並列処理させたい。
6 process = subprocess.Popen(['echo', '--psm', '1', '--oem', '1', image_path, text_path], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
7
8 return process
9
10
11def detection_async_parallel(requests):
12 processes = []
13 for request in requests:
14 processes.append(detection_async(request))
15
16 results = []
17 for p in processes:
18 results.append(p.communicate())
19
20 return results
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 07:08
2020/12/07 08:47 編集