回答編集履歴

11

修正

2020/08/06 22:28

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/08/06 22:28

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/08/06 17:43

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/08/06 17:24

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/08/06 17:22

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -38,9 +38,9 @@
38
38
 
39
39
  a = random.randint(0,6)
40
40
 
41
- print(f"wait for {a} sec")
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
- なお、上記で async def text_preprocess(sentence):内のsleepをコメント化しているのは、ダウンロードの並行性だけ見たかったからです。
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
- async def text_preprocess(sentence): 内のコメント部分行(sleepコメントアウトして行した場合、
115
+ ただし、text_preprocess内のasyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
112
116
 
113
- ダウンロード時間+「3つのランダムスリープ時間の合計時間ではなく、3つのうちの最大時間」までしかウェイトされないことがわかると思います。
114
-
115
- (もちろん、asyncio.sleep()部分を実際の処理に置き換える場合、その処理自体がノンブロッキングでなければasyncioのメリットは享受できません。
116
-
117
- 処理がネットワーク通信やファイル処理等のI/OバウンドではなくCPU計算負荷がかかるような場合は、その部分はmultiprocessを使った方がいいです。
117
+ ネットワーク通信やデータベース処理、ファイル処理等のI/Oバウンドではなく、たとえばBeautifulSoupによるタグ検索等単純にCPU計算負荷がかかるような処理については、multiprocessを使った方がいいです。
118
118
 
119
119
 
120
120
 
121
+ [補足2]
122
+
121
- なお、run_in_executorを使う方法もあるかもしれせんが、これだとマルチスレッドの話になると思ったので割愛しました。
123
+ requestsとrun_in_executorを使う方法もあが、イベントループやマルチスレッド寄りの話になるので割愛しました。

6

修正

2020/08/06 17:17

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
  以上です。
94
94
 
95
- 比較として別途[aiohttpではなくrequestを使った場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
95
+ 比較として別途[aiohttprequestに単純に置き換えた場合のコード](https://gist.github.com/taizan-hokuto/5b9075f01b6a87bc0110c88cb7eac6c0)を用意しましたので、これを実行した場合の時間と比べてみてください。
96
96
 
97
97
  ネットワーク状態にもよるかもしれませんが、おおむね、aiohttpを使用している上記のコードの方が早く完了すると思います。(requestsの方はダウンロードごとにブロックされており並行処理になっていないため時間がかかる)
98
98
 

5

修正

2020/08/06 16:16

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/08/06 15:26

投稿

kotori_a
kotori_a

スコア820

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

修正

2020/08/06 15:25

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -1,6 +1,4 @@
1
- requestsモジュールを使う場合、asyncioだけで期待した動作をさせるのは困難です。
2
-
3
- 代わりに非同期通信に対応したライブラリであるaiohttpを使う方法があります。
1
+ requestsモジュールの代わりに非同期通信に対応したライブラリであるaiohttpを使う方法があります。
4
2
 
5
3
  ```
6
4
 

2

修正

2020/08/06 15:17

投稿

kotori_a
kotori_a

スコア820

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

修正・追加

2020/08/06 15:15

投稿

kotori_a
kotori_a

スコア820

test CHANGED
@@ -94,12 +94,32 @@
94
94
 
95
95
 
96
96
 
97
- 上記で async def text_preprocess(sentence):内のsleepコメント化ているのは、ダウンロードの並行性だけ見いからです
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を使う方法もあるかもしれませんが、これだとマルチスレッドの話になると思ったので割愛しました。