回答編集履歴
7
修正
test
CHANGED
@@ -144,8 +144,6 @@
|
|
144
144
|
|
145
145
|
task.add_done_callback(finish)
|
146
146
|
|
147
|
-
return board
|
148
|
-
|
149
147
|
|
150
148
|
|
151
149
|
|
6
修正
test
CHANGED
@@ -70,6 +70,8 @@
|
|
70
70
|
|
71
71
|
```python
|
72
72
|
|
73
|
+
# https://teratail.com/questions/312558#reply-436434
|
74
|
+
|
73
75
|
import asyncio
|
74
76
|
|
75
77
|
import json
|
@@ -136,7 +138,7 @@
|
|
136
138
|
|
137
139
|
await asyncio.sleep(5)
|
138
140
|
|
139
|
-
print_t(f"[TASKID:{board.get('id')}] 「何らかの処理」が完了しました(「wait終わり」)
|
141
|
+
print_t(f"[TASKID:{board.get('id')}] 「何らかの処理」が完了しました。(「wait終わり」)続いてダウンロードを開始します。")
|
140
142
|
|
141
143
|
task = loop.create_task(get_url(board.get('id')))
|
142
144
|
|
@@ -160,6 +162,22 @@
|
|
160
162
|
|
161
163
|
return cid
|
162
164
|
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
loop = asyncio.get_event_loop()
|
170
|
+
|
171
|
+
loop.create_task(stream())
|
172
|
+
|
173
|
+
try:
|
174
|
+
|
175
|
+
loop.run_forever()
|
176
|
+
|
177
|
+
except KeyboardInterrupt:
|
178
|
+
|
179
|
+
exit()
|
180
|
+
|
163
181
|
```
|
164
182
|
|
165
183
|
|
5
修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
await asyncio.sleep(5)
|
138
138
|
|
139
|
-
print_t(f"[TASKID:{board.get('id')}] 「何らかの処理」が完了しました。続いてダウンロードを開始します。")
|
139
|
+
print_t(f"[TASKID:{board.get('id')}] 「何らかの処理」が完了しました(「wait終わり」)。続いてダウンロードを開始します。")
|
140
140
|
|
141
141
|
task = loop.create_task(get_url(board.get('id')))
|
142
142
|
|
@@ -166,6 +166,6 @@
|
|
166
166
|
|
167
167
|
|
168
168
|
|
169
|
-
タスクは、それぞれ(ほぼ)「5秒毎」で順番に処理されていきますが、同一TASKIDに対応するダウンロード処理はメッセージ
|
169
|
+
タスクは、それぞれ(ほぼ)「5秒毎」で順番に処理されていきますが、同一TASKIDに対応するダウンロード処理はメッセージに対する「何らかの処理」が完了した直後に開始され、裏でダウンロード処理されていることがお分かりかと思います。
|
170
170
|
|
171
171
|
(ダウンロード時間が短いためわかりにくいですが)
|
4
修正
test
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
質問の文章とコードだといまいち分かりにくかったので、client.pyとserver.pyを、処理の流れがわかる形で出力するように書き直しました。
|
2
2
|
|
3
|
-
**「何らかの処理(5秒sleep)を行った後、ダウンロードを行う」という動作を
|
3
|
+
質問文に記載の通り**「何らかの処理(ここでは5秒sleep)を行った後、次のメッセージを受け取って同じように『何らかの処理』を行う。ただし裏で逐次ダウンロードを行う」**という単位動作を同時並行にやっているように見せています。
|
4
|
-
|
5
|
-
この単位動作を同時並行にやっているように見せています。
|
6
4
|
|
7
5
|
|
8
6
|
|
@@ -104,7 +102,7 @@
|
|
104
102
|
|
105
103
|
def finish(board):
|
106
104
|
|
107
|
-
print_t(f"[TASKID:{board.result()
|
105
|
+
print_t(f"[TASKID:{board.result()}] タスクが終了しました")
|
108
106
|
|
109
107
|
|
110
108
|
|
@@ -112,7 +110,7 @@
|
|
112
110
|
|
113
111
|
async def stream():
|
114
112
|
|
115
|
-
|
113
|
+
|
116
114
|
|
117
115
|
uri = 'ws://127.0.0.1:5678/'
|
118
116
|
|
@@ -124,13 +122,15 @@
|
|
124
122
|
|
125
123
|
board = json.loads(response)
|
126
124
|
|
127
|
-
|
125
|
+
await event(board)
|
128
126
|
|
129
|
-
|
127
|
+
|
130
128
|
|
131
129
|
|
132
130
|
|
133
131
|
async def event(board):
|
132
|
+
|
133
|
+
loop = asyncio.get_event_loop()
|
134
134
|
|
135
135
|
print_t(f"[TASKID:{board.get('id')}] 受け取ったメッセージの「何らかの処理」を開始します(ダミーとして5秒sleep) {str(board)}")
|
136
136
|
|
@@ -138,7 +138,9 @@
|
|
138
138
|
|
139
139
|
print_t(f"[TASKID:{board.get('id')}] 「何らかの処理」が完了しました。続いてダウンロードを開始します。")
|
140
140
|
|
141
|
-
a
|
141
|
+
task = loop.create_task(get_url(board.get('id')))
|
142
|
+
|
143
|
+
task.add_done_callback(finish)
|
142
144
|
|
143
145
|
return board
|
144
146
|
|
@@ -156,21 +158,7 @@
|
|
156
158
|
|
157
159
|
print_t(f"[TASKID:{cid}] ダウンロード完了:先頭20文字{res.read()[:20]}")
|
158
160
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
loop = asyncio.get_event_loop()
|
164
|
-
|
165
|
-
loop.create_task(stream())
|
166
|
-
|
167
|
-
try:
|
168
|
-
|
169
|
-
loop.run_forever()
|
170
|
-
|
171
|
-
except KeyboardInterrupt:
|
172
|
-
|
173
|
-
e
|
161
|
+
return cid
|
174
162
|
|
175
163
|
```
|
176
164
|
|
@@ -178,4 +166,6 @@
|
|
178
166
|
|
179
167
|
|
180
168
|
|
181
|
-
|
169
|
+
タスクは、それぞれ(ほぼ)「5秒毎」で順番に処理されていきますが、同一TASKIDに対応するダウンロード処理はメッセージを受け取った直後に開始され、裏で処理されていることがお分かりかと思います。
|
170
|
+
|
171
|
+
(ダウンロード時間が短いためわかりにくいですが)
|
3
修正
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
質問の文章とコードだといまいち分かりにくかったので、client.pyとserver.pyを、処理の流れがわかる形で出力するように書き直しました。
|
2
2
|
|
3
|
-
**「
|
3
|
+
**「何らかの処理(5秒sleep)を行った後、ダウンロードを行う」という動作を一つの単位**として、
|
4
4
|
|
5
5
|
この単位動作を同時並行にやっているように見せています。
|
6
6
|
|
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
now = datetime.datetime.utcnow().isoformat() + "Z"
|
42
42
|
|
43
|
-
cid = f"{count:
|
43
|
+
cid = f"{count:>6}"
|
44
44
|
|
45
45
|
char = 'longlongstr'
|
46
46
|
|
@@ -100,9 +100,13 @@
|
|
100
100
|
|
101
101
|
|
102
102
|
|
103
|
+
|
104
|
+
|
103
105
|
def finish(board):
|
104
106
|
|
105
107
|
print_t(f"[TASKID:{board.result().get('id')}] タスクが終了しました")
|
108
|
+
|
109
|
+
|
106
110
|
|
107
111
|
|
108
112
|
|
@@ -128,15 +132,13 @@
|
|
128
132
|
|
129
133
|
async def event(board):
|
130
134
|
|
131
|
-
print_t(f"[TASKID:{board.get('id')}] ダウンロード開始")
|
132
|
-
|
133
|
-
await get_url(board.get('id'))
|
134
|
-
|
135
|
-
print_t(f"[TASKID:{board.get('id')}]
|
135
|
+
print_t(f"[TASKID:{board.get('id')}] 受け取ったメッセージの「何らかの処理」を開始します(ダミーとして5秒sleep) {str(board)}")
|
136
136
|
|
137
137
|
await asyncio.sleep(5)
|
138
138
|
|
139
|
-
print_t(f"[TASKID:{board.get('id')}]
|
139
|
+
print_t(f"[TASKID:{board.get('id')}] 「何らかの処理」が完了しました。続いてダウンロードを開始します。")
|
140
|
+
|
141
|
+
await get_url(board.get('id'))
|
140
142
|
|
141
143
|
return board
|
142
144
|
|
@@ -176,4 +178,4 @@
|
|
176
178
|
|
177
179
|
|
178
180
|
|
179
|
-
同一TASKIDのタスクは、それぞれ「ダウンロード時間
|
181
|
+
同一TASKIDのタスクは、それぞれ「5秒+ダウンロード時間」で順番に処理されていきますが、タスク自体はserverからのランダム秒数のメッセージ発行に合わせて次々に処理されていることがお分かりかと思います。
|
2
修正
test
CHANGED
@@ -3,8 +3,6 @@
|
|
3
3
|
**「ダウンロードを開始し、ダウンロードが終わった後、5秒待つ」という動作を一つの単位**として、
|
4
4
|
|
5
5
|
この単位動作を同時並行にやっているように見せています。
|
6
|
-
|
7
|
-
(この単位動作自体は、御存じのようにserver.pyでランダム秒数毎に発行されています)
|
8
6
|
|
9
7
|
|
10
8
|
|
1
修正
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
質問の文章とコードだといまいち分かりにくかったので、client.pyとserver.pyを、処理の流れがわかる形で出力するように書き直しました。
|
2
2
|
|
3
|
-
**「ダウンロードが終わった後、5秒待つ」という動作を一つの単位**として、
|
3
|
+
**「ダウンロードを開始し、ダウンロードが終わった後、5秒待つ」という動作を一つの単位**として、
|
4
4
|
|
5
5
|
この単位動作を同時並行にやっているように見せています。
|
6
6
|
|
@@ -148,13 +148,13 @@
|
|
148
148
|
|
149
149
|
async def get_url(cid):
|
150
150
|
|
151
|
-
url = 'http://www.
|
151
|
+
url = 'http://www.example.com/'
|
152
152
|
|
153
153
|
req = urllib.request.Request(url)
|
154
154
|
|
155
155
|
with urllib.request.urlopen(req) as res:
|
156
156
|
|
157
|
-
print_t(f"[TASKID:{cid}] ダウンロード完了:先頭
|
157
|
+
print_t(f"[TASKID:{cid}] ダウンロード完了:先頭20文字{res.read()[:20]}")
|
158
158
|
|
159
159
|
|
160
160
|
|