回答編集履歴

7

修正

2020/12/27 08:33

投稿

退会済みユーザー
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

修正

2020/12/27 08:33

投稿

退会済みユーザー
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

修正

2020/12/27 07:56

投稿

退会済みユーザー
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

修正

2020/12/27 03:03

投稿

退会済みユーザー
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().get('id')}] タスクが終了しました")
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
- loop = asyncio.get_event_loop()
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
- task = loop.create_task(event(board))
125
+ await event(board)
128
126
 
129
- task.add_done_callback(finish)
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
- await get_url(board.get('id'))
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
- exit()
161
+ return cid
174
162
 
175
163
  ```
176
164
 
@@ -178,4 +166,6 @@
178
166
 
179
167
 
180
168
 
181
- 同一TASKIDのタスクは、それぞれ「5秒+ダウンロード時間」で順番に処理されていきますが、タスク自体serverからのランダム秒数のメッセージ発行合わせて次々に処理されていることがお分かりかと思います。
169
+ タスクは、それぞれ(ほぼ)「5秒」で順番に処理されていきますが、同一TASKIDに対応するダウンロード処理はメッセージを受け取った直後開始され、裏で処理されていることがお分かりかと思います。
170
+
171
+ (ダウンロード時間が短いためわかりにくいですが)

3

修正

2020/12/27 02:59

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,6 @@
1
1
  質問の文章とコードだといまいち分かりにくかったので、client.pyとserver.pyを、処理の流れがわかる形で出力するように書き直しました。
2
2
 
3
- **「ダウンロード開始し、ダウンロードが終わった後、5秒待つ」という動作を一つの単位**として、
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:0>8}"
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')}] これ5秒待つ {str(board)}")
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')}] wait終わり")
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のタスクは、それぞれ「ダウンロード時間+5秒」で順番に処理されていきますが、タスク自体は次々に処理されていることがお分かりかと思います。
181
+ 同一TASKIDのタスクは、それぞれ「5秒+ダウンロード時間」で順番に処理されていきますが、タスク自体はserverからのランダム秒数のメッセージ発行に合わせて次々に処理されていることがお分かりかと思います。

2

修正

2020/12/27 02:48

投稿

退会済みユーザー
test CHANGED
@@ -3,8 +3,6 @@
3
3
  **「ダウンロードを開始し、ダウンロードが終わった後、5秒待つ」という動作を一つの単位**として、
4
4
 
5
5
  この単位動作を同時並行にやっているように見せています。
6
-
7
- (この単位動作自体は、御存じのようにserver.pyでランダム秒数毎に発行されています)
8
6
 
9
7
 
10
8
 

1

修正

2020/12/27 02:34

投稿

退会済みユーザー
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.fukushizaidan.jp/'
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}] ダウンロード完了:先頭10文字{res.read()[:10]}")
157
+ print_t(f"[TASKID:{cid}] ダウンロード完了:先頭20文字{res.read()[:20]}")
158
158
 
159
159
 
160
160