非同期に処理を実行したい
APIの処理で、DBに書き込む処理の後、通知を出したいが
通知の処理が完了する前にAPIの呼び出し側にレスポンスを返したい。
サンプルを作成して実行しているが非同期にならなくて困っている。
最初に試したもの
test.py
python
1import asyncio 2import requests 3 4url = 'https://google.co.jp' 5 6 7def ex(): 8 print(" 5 ") 9 r = requests.get(url) 10 print(r.status_code) 11 print(" 6 ") 12 13 14loop = asyncio.get_event_loop() 15print(" 1 ") 16loop.run_in_executor(None, ex) 17print(" 2 ")
これだと以下の結果になりうまくいく
1
5
2
200
6
APIで試した
api.py
python
1import asyncio 2from django.utils.timezone import localtime 3from hr.common import glgl as glgl 4 5 6class testAPI(ViewSet): 7 8 @action(detail=False, methods=['post']) 9 def test(self, request): 10 print("■■■ T1 ■■■ : " + str(localtime())) 11 loop = asyncio.new_event_loop() 12 asyncio.set_event_loop(loop) 13 loop.run_in_executor(None, glgl.glgl()) 14 loop.close() 15 16 print("■■■ T2 ■■■ : " + str(localtime())) 17 return Response("A", status=status.HTTP_200_OK)
glgl.py
python
1import requests 2from django.utils.timezone import localtime 3 4 5def glgl(): 6 7 print("■■■ G1 ■■■ : " + str(localtime())) 8 r = requests.get('https://google.co.jp') 9 print(r) 10 print("■■■ G2 ■■■ : " + str(localtime()))
これだと上手くいかない
■■■ T1 ■■■ : 2020-09-13 16:30:38.730048+09:00
■■■ G1 ■■■ : 2020-09-13 16:30:38.730943+09:00
<Response [200]>
■■■ G2 ■■■ : 2020-09-13 16:30:39.237304+09:00
■■■ T2 ■■■ : 2020-09-13 16:30:39.239700+09:00
######以下の結果になるように非同期処理をするにはどうすればいいのでしょうか?
■■■ T1 ■■■ : 2020-09-13 16:30:38.730048+09:00
■■■ G1 ■■■ : 2020-09-13 16:30:38.730943+09:00
■■■ T2 ■■■ : 2020-09-13 16:30:38.730943+09:00
<Response [200]>
■■■ G2 ■■■ : 2020-09-13 16:30:39.237304+09:00
###追記
色々検索した結果
aiohttpを調べてみようと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/13 08:59
2020/09/13 09:10
2020/09/13 09:16