回答編集履歴
11
修正
test
CHANGED
@@ -90,8 +90,6 @@
|
|
90
90
|
|
91
91
|
```
|
92
92
|
|
93
|
-
以上です。
|
94
|
-
|
95
93
|
|
96
94
|
|
97
95
|
比較として別途[aiohttpをrequestsに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
10
修正
test
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
s = await session.get(url)
|
22
22
|
|
23
|
-
await asyncio.sleep(0)
|
23
|
+
# await asyncio.sleep(0) # この行はrequestsバージョンでは必要
|
24
24
|
|
25
25
|
sentence = await s.text() # requestsでは.textだが、aiohtttpは.text()
|
26
26
|
|
9
修正
test
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
await asyncio.sleep(0)
|
24
24
|
|
25
|
-
sentence = await s.text()
|
25
|
+
sentence = await s.text() # requestsでは.textだが、aiohtttpは.text()
|
26
26
|
|
27
27
|
print(f"download {url} completed!")
|
28
28
|
|
8
修正
test
CHANGED
@@ -92,9 +92,13 @@
|
|
92
92
|
|
93
93
|
以上です。
|
94
94
|
|
95
|
-
比較として別途[aiohttpをrequestsに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
96
95
|
|
96
|
+
|
97
|
+
比較として別途[aiohttpをrequestsに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
98
|
+
|
99
|
+
|
100
|
+
|
97
|
-
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用している上記のコードの方が早く完了すると思います。(requestsの方はダウンロードごとにブロックされており並行処理になっていないため時間がかかる)
|
101
|
+
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用している上記のコードの方が早く完了すると思います。(requestsの方はダウンロードごとにブロックされており並行処理になっていないため時間がかかる)
|
98
102
|
|
99
103
|
|
100
104
|
|
@@ -104,20 +108,34 @@
|
|
104
108
|
|
105
109
|
[補足1]
|
106
110
|
|
107
|
-
上記では、ダウンロードの並行性だけを見るため、 async def text_preprocess(sentence):内のsleepをコメント化しています。
|
111
|
+
上記では、ダウンロードの並行性だけを見るため、 async def text_preprocess(sentence):内のsleepをコメント化しています。
|
108
112
|
|
113
|
+
|
114
|
+
|
109
|
-
text_preprocess処理の並行性も見る場合は、async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして実行してみてください。
|
115
|
+
text_preprocess処理の並行性も見る場合は、async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして実行してみてください。
|
116
|
+
|
117
|
+
|
110
118
|
|
111
119
|
3つのランダムスリープ時間の「合計」ではなく、3つのうちの最大時間までしかウェイトされないことがわかると思います。
|
112
120
|
|
113
121
|
|
114
122
|
|
115
|
-
ただし、text_preprocess内のasyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
123
|
+
ただし、text_preprocess内のasyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
116
124
|
|
125
|
+
|
126
|
+
|
117
|
-
ネットワーク通信やデータベース処理、ファイル処理等のI/Oバウンドではなく、たとえばBeautifulSoupによるタグ検索等単純にCPUの計算負荷がかかるような処理については、multiprocessを使った方がい
|
127
|
+
ネットワーク通信やデータベース処理、ファイル処理等のI/Oバウンドではなく、たとえばBeautifulSoupによるタグ検索等単純にCPUの計算負荷がかかるような処理については、multiprocessを使った方が効果が出ると思います。
|
118
128
|
|
119
129
|
|
120
130
|
|
121
131
|
[補足2]
|
122
132
|
|
123
133
|
requestsとrun_in_executorを使う方法もありますが、イベントループやマルチスレッド寄りの話になるので割愛しました。
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
参考:
|
138
|
+
|
139
|
+
[asyncio --- 非同期 I/O](https://docs.python.org/ja/3/library/asyncio.html)
|
140
|
+
|
141
|
+
[aiohttp documentation](https://docs.aiohttp.org/en/stable/)
|
7
修正
test
CHANGED
@@ -38,9 +38,9 @@
|
|
38
38
|
|
39
39
|
a = random.randint(0,6)
|
40
40
|
|
41
|
-
print(f"
|
41
|
+
print(f"processing for {a} sec")
|
42
42
|
|
43
|
-
# await asyncio.sleep(a) # ダウンロード処理時間だけ見たい場合、ここはコメント
|
43
|
+
# await asyncio.sleep(a) # ダウンロード処理時間だけ見たい場合、ここはコメントにする
|
44
44
|
|
45
45
|
return a
|
46
46
|
|
@@ -92,7 +92,7 @@
|
|
92
92
|
|
93
93
|
以上です。
|
94
94
|
|
95
|
-
比較として別途[aiohttpをrequestに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
95
|
+
比較として別途[aiohttpをrequestsに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
96
96
|
|
97
97
|
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用している上記のコードの方が早く完了すると思います。(requestsの方はダウンロードごとにブロックされており並行処理になっていないため時間がかかる)
|
98
98
|
|
@@ -102,20 +102,22 @@
|
|
102
102
|
|
103
103
|
|
104
104
|
|
105
|
-
[補足]
|
105
|
+
[補足1]
|
106
106
|
|
107
|
-
|
107
|
+
上記では、ダウンロードの並行性だけを見るため、 async def text_preprocess(sentence):内のsleepをコメント化しています。
|
108
|
+
|
109
|
+
text_preprocess処理の並行性も見る場合は、async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして実行してみてください。、
|
110
|
+
|
111
|
+
3つのランダムスリープ時間の「合計」ではなく、3つのうちの最大時間までしかウェイトされないことがわかると思います。
|
108
112
|
|
109
113
|
|
110
114
|
|
111
|
-
|
115
|
+
ただし、text_preprocess内のasyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
112
116
|
|
113
|
-
ダウンロード時間+「3つのランダムスリープ時間の合計時間ではなく、3つのうちの最大時間」までしかウェイトされないことがわかると思います。
|
114
|
-
|
115
|
-
(もちろん、asyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
116
|
-
|
117
|
-
|
117
|
+
ネットワーク通信やデータベース処理、ファイル処理等のI/Oバウンドではなく、たとえばBeautifulSoupによるタグ検索等単純にCPUの計算負荷がかかるような処理については、multiprocessを使った方がいいです。
|
118
118
|
|
119
119
|
|
120
120
|
|
121
|
+
[補足2]
|
122
|
+
|
121
|
-
|
123
|
+
requestsとrun_in_executorを使う方法もありますが、イベントループやマルチスレッド寄りの話になるので割愛しました。
|
6
修正
test
CHANGED
@@ -92,7 +92,7 @@
|
|
92
92
|
|
93
93
|
以上です。
|
94
94
|
|
95
|
-
比較として別途[aiohttp
|
95
|
+
比較として別途[aiohttpをrequestに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
96
96
|
|
97
97
|
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用している上記のコードの方が早く完了すると思います。(requestsの方はダウンロードごとにブロックされており並行処理になっていないため時間がかかる)
|
98
98
|
|
5
修正
test
CHANGED
@@ -110,9 +110,7 @@
|
|
110
110
|
|
111
111
|
async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして実行した場合、
|
112
112
|
|
113
|
-
ダウンロード時間+「3つのランダムスリープ時間の合計時間ではなく、3つのうちの最大時間」までしかウェイトされないことがわかると思います。
|
113
|
+
ダウンロード時間+「3つのランダムスリープ時間の合計時間ではなく、3つのうちの最大時間」までしかウェイトされないことがわかると思います。
|
114
|
-
|
115
|
-
|
116
114
|
|
117
115
|
(もちろん、asyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
118
116
|
|
4
修正
test
CHANGED
@@ -90,15 +90,13 @@
|
|
90
90
|
|
91
91
|
```
|
92
92
|
|
93
|
+
以上です。
|
94
|
+
|
95
|
+
比較として別途[aiohttpではなくrequestを使った場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
|
96
|
+
|
97
|
+
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用している上記のコードの方が早く完了すると思います。(requestsの方はダウンロードごとにブロックされており並行処理になっていないため時間がかかる)
|
93
98
|
|
94
99
|
|
95
|
-
[aiohttpではなくrequestを使った場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しました。
|
96
|
-
|
97
|
-
これを実行した場合の完了まで時間と比較してみてください。
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用しているコードの方が早く完了することがわかると思います。
|
102
100
|
|
103
101
|
|
104
102
|
|
3
修正
test
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
requestsモジュールを使う場合、asyncioだけで期待した動作をさせるのは困難です。
|
2
|
-
|
3
|
-
代わりに非同期通信に対応したライブラリであるaiohttpを使う方法があります。
|
1
|
+
requestsモジュールの代わりに非同期通信に対応したライブラリであるaiohttpを使う方法があります。
|
4
2
|
|
5
3
|
```
|
6
4
|
|
2
修正
test
CHANGED
@@ -100,13 +100,13 @@
|
|
100
100
|
|
101
101
|
|
102
102
|
|
103
|
-
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用し
|
103
|
+
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用しているコードの方が早く完了することがわかると思います。
|
104
104
|
|
105
105
|
|
106
106
|
|
107
107
|
|
108
108
|
|
109
|
-
|
109
|
+
[補足]
|
110
110
|
|
111
111
|
なお、上記で async def text_preprocess(sentence):内のsleepをコメント化しているのは、ダウンロードの並行性だけ見たかったからです。
|
112
112
|
|
@@ -114,7 +114,9 @@
|
|
114
114
|
|
115
115
|
async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして実行した場合、
|
116
116
|
|
117
|
-
ダウンロード時間+「3つのランダムスリープ時間の最大」までしかウェイトされないことがわかると思います。
|
117
|
+
ダウンロード時間+「3つのランダムスリープ時間の合計時間ではなく、3つのうちの最大時間」までしかウェイトされないことがわかると思います。(並行処理されているから)
|
118
|
+
|
119
|
+
|
118
120
|
|
119
121
|
(もちろん、asyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
120
122
|
|
1
修正・追加
test
CHANGED
@@ -94,12 +94,32 @@
|
|
94
94
|
|
95
95
|
|
96
96
|
|
97
|
-
|
97
|
+
[aiohttpではなくrequestを使った場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しました。
|
98
98
|
|
99
|
+
これを実行した場合の完了まで時間と比較してみてください。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用した方が早く完了することがわかると思います。
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
なお、上記で async def text_preprocess(sentence):内のsleepをコメント化しているのは、ダウンロードの並行性だけ見たかったからです。
|
112
|
+
|
113
|
+
|
114
|
+
|
99
|
-
async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして
|
115
|
+
async def text_preprocess(sentence): 内のコメント部分行(sleep)をコメントアウトして実行した場合、
|
100
116
|
|
101
117
|
ダウンロード時間+「3つのランダムスリープ時間の最大」までしかウェイトされないことがわかると思います。
|
102
118
|
|
103
119
|
(もちろん、asyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
|
104
120
|
|
105
121
|
処理がネットワーク通信やファイル処理等のI/OバウンドではなくCPUに計算負荷がかかるような場合は、その部分はmultiprocessを使った方がいいです。)
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
なお、run_in_executorを使う方法もあるかもしれませんが、これだとマルチスレッドの話になると思ったので割愛しました。
|