回答編集履歴

15

 

2022/08/22 12:00

投稿

退会済みユーザー
test CHANGED
@@ -104,3 +104,105 @@
104
104
  停止する場合はCTRL+Cを押してください。
105
105
  止めることができなくても構わない、というなら try ~ except で囲まなくてもいいですが・・・。
106
106
 
107
+
108
+ -----------
109
+
110
+ # 分割例
111
+
112
+ 仮に bitflyer.py と main.py を分割して、main.pyだけ実行して同じようなことがしたいなら、下記のようになります。
113
+
114
+ bitflyer.py
115
+ ```py
116
+ import json
117
+ import logging
118
+ import sys
119
+ import websocket
120
+ from queue import Queue
121
+
122
+ logging.basicConfig(level=logging.INFO, stream=sys.stdout)
123
+ logger = logging.getLogger(__name__)
124
+
125
+ que = Queue() # データ受け渡しのためのキュー
126
+
127
+ stop = {"status":False} # 停止するためのフラグ
128
+
129
+
130
+ class RealtimeAPI(object):
131
+
132
+ def __init__(self, url, channel):
133
+ self.url = url
134
+ self.channel = channel
135
+ self.connect()
136
+
137
+ def connect(self):
138
+ self.ws = websocket.WebSocketApp\
139
+ (self.url,header=None,on_open=self.on_open,\
140
+ on_message=self.on_message, on_error=self.on_error,\
141
+ on_close=self.on_close)
142
+ self.ws.run_forever()
143
+ logger.info('Web Socket process ended.')
144
+
145
+ """
146
+ Below are callback functions of websocket.
147
+ """
148
+ # when we get message
149
+ def on_message(self, ws, message):
150
+ resp = json.loads(message)['params']['message']
151
+ self.set_realtime_ticker(resp)
152
+
153
+ if stop["status"]:
154
+ # 停止フラグがTrueならwebsocketをクローズする。
155
+ self.ws.close()
156
+
157
+ # when error occurs
158
+ def on_error(self, ws, error):
159
+ logger.error(error)
160
+
161
+ # when websocket closed.
162
+ def on_close(self, ws):
163
+ logger.info('disconnected streaming server')
164
+
165
+ # when websocket opened.
166
+ def on_open(self, ws):
167
+ logger.info('connected streaming server')
168
+ input_data = json.dumps(
169
+ {'method' : 'subscribe',
170
+ 'params' : {'channel' : self.channel}
171
+ }
172
+ )
173
+ ws.send(input_data)
174
+
175
+ def set_realtime_ticker(self, resp):
176
+ timestamp = resp['timestamp']
177
+ product_code = resp['product_code']
178
+ volume = float(resp['volume'])
179
+ ticker = [product_code, timestamp, volume]
180
+ que.put(ticker) #キューに ticker を入れる。
181
+ ```
182
+
183
+
184
+ main.py
185
+ ```py
186
+ import time
187
+ from concurrent.futures import ThreadPoolExecutor
188
+ from bitflyer import RealtimeAPI, que, stop
189
+
190
+
191
+ def task():
192
+ url = "wss://ws.lightstream.bitflyer.com/json-rpc"
193
+ channel = "lightning_ticker_FX_BTC_JPY"
194
+ RealtimeAPI(url=url, channel=channel)
195
+
196
+ if __name__ == "__main__":
197
+ executor = ThreadPoolExecutor()
198
+ executor.submit(task)
199
+ try:
200
+ while True:
201
+ # キューから ticker を取り出す。
202
+ ticker_data = str(que.get())
203
+ print(ticker_data) # ここでAPIから入ってくるtickerのデータを表示
204
+ time.sleep(1)
205
+ except KeyboardInterrupt:
206
+ stop["status"] = True
207
+ executor.shutdown()
208
+ ```

14

 

2022/08/22 11:42

投稿

退会済みユーザー
test CHANGED
@@ -79,7 +79,6 @@
79
79
  product_code = resp['product_code']
80
80
  volume = float(resp['volume'])
81
81
  ticker = [product_code, timestamp, volume]
82
- # logger.info(f'ticker={ticker}')
83
82
  que.put(ticker) #キューに ticker を入れる。
84
83
 
85
84
 

13

 

2022/08/22 11:41

投稿

退会済みユーザー
test CHANGED
@@ -15,19 +15,19 @@
15
15
  bitflyer.py
16
16
  ```py
17
17
  import logging
18
+ import json
19
+ import sys
20
+ import time
18
21
  import websocket
19
- import json
22
+ from concurrent.futures import ThreadPoolExecutor
20
- import time
21
23
  from queue import Queue
22
- from concurrent.futures import ThreadPoolExecutor
23
24
 
24
- import sys
25
25
  logging.basicConfig(level=logging.INFO, stream=sys.stdout)
26
26
  logger = logging.getLogger(__name__)
27
27
 
28
28
  que = Queue() # データ受け渡しのためのキュー
29
+ stop = {"status":False} # 停止するためのフラグ
29
30
 
30
- stop = {"status":False} # 停止するためのフラグ
31
31
 
32
32
  class RealtimeAPI(object):
33
33
 
@@ -89,7 +89,6 @@
89
89
  RealtimeAPI(url=url, channel=channel)
90
90
 
91
91
 
92
-
93
92
  executor = ThreadPoolExecutor()
94
93
  executor.submit(task)
95
94
  try:

12

 

2022/08/22 11:40

投稿

退会済みユーザー
test CHANGED
@@ -21,6 +21,8 @@
21
21
  from queue import Queue
22
22
  from concurrent.futures import ThreadPoolExecutor
23
23
 
24
+ import sys
25
+ logging.basicConfig(level=logging.INFO, stream=sys.stdout)
24
26
  logger = logging.getLogger(__name__)
25
27
 
26
28
  que = Queue() # データ受け渡しのためのキュー
@@ -87,6 +89,7 @@
87
89
  RealtimeAPI(url=url, channel=channel)
88
90
 
89
91
 
92
+
90
93
  executor = ThreadPoolExecutor()
91
94
  executor.submit(task)
92
95
  try:
@@ -97,9 +100,9 @@
97
100
  time.sleep(1)
98
101
  except KeyboardInterrupt:
99
102
  stop["status"] = True
100
- executor.shutdown()
103
+ executor.shutdown()
104
+
101
105
  ```
102
106
  停止する場合はCTRL+Cを押してください。
103
- try: ~ exceptで囲んでいるのは安全に停止するためです。
104
107
  止めることができなくても構わない、というなら try ~ except で囲まなくてもいいですが・・・。
105
108
 

11

 

2022/08/22 11:36

投稿

退会済みユーザー
test CHANGED
@@ -6,7 +6,7 @@
6
6
  のような形で書いてticker_data の"内容を表示したい”」
7
7
  と理解しました。
8
8
 
9
- これは、下記のようにマルチスレッドを使用すればできます。
9
+ これは、下記のようにマルチスレッドを使用し、キューを使って受け渡しすればできます。
10
10
 
11
11
  なお、下記の場合 **main.py は無関係になるので、main.py の実行は不要**であり、
12
12
  **bitflyer.py を実行**すればよいです。

10

 

2022/08/22 11:32

投稿

退会済みユーザー
test CHANGED
@@ -1,10 +1,9 @@
1
- コメントによるヒヤリングを経た結果
1
+ コメントによるヒヤリングを経た結果、結局
2
- 「print(ticker_data)」のticker_dataにデータを入れたい
2
+ 「print(ticker_data)」のticker_dataにデータを入れたい」ということでした。
3
+
3
- すなわち print と組み合わせていることから読み解くに
4
+ print と組み合わせていることから読み解くに
4
- 「bitflyer.py の中(下の方)に
5
+ 多分「bitflyer.py の中(下の方)に、print(ticker_data)
5
- print(ticker_data)
6
- のような形にして
7
- ticker_data の"内容を表示したい”」
6
+ のような形で書いてticker_data の"内容を表示したい”」
8
7
  と理解しました。
9
8
 
10
9
  これは、下記のようにマルチスレッドを使用すればできます。

9

 

2022/08/22 11:31

投稿

退会済みユーザー
test CHANGED
@@ -100,5 +100,7 @@
100
100
  stop["status"] = True
101
101
  executor.shutdown()
102
102
  ```
103
+ 停止する場合はCTRL+Cを押してください。
104
+ try: ~ exceptで囲んでいるのは安全に停止するためです。
103
- 場合はCTRL+Cを押してください。(try: ~ except囲んでいるのはそのためです。安全に止めなくても構わない、というなら try ~ except で囲まなくてもいいですが・・・
105
+ ことがなくても構わない、というなら try ~ except で囲まなくてもいいですが・・・
104
106
 

8

 

2022/08/22 11:30

投稿

退会済みユーザー
test CHANGED
@@ -100,3 +100,5 @@
100
100
  stop["status"] = True
101
101
  executor.shutdown()
102
102
  ```
103
+ 停止する場合はCTRL+Cを押してください。(try: ~ exceptで囲んでいるのはそのためです。安全に止めなくても構わない、というなら try ~ except で囲囲まなくてもいいですが・・・)
104
+

7

 

2022/08/22 11:28

投稿

退会済みユーザー
test CHANGED
@@ -1,7 +1,7 @@
1
1
  コメントによるヒヤリングを経た結果
2
2
  「print(ticker_data)」のticker_dataにデータを入れたい、
3
3
  すなわち print と組み合わせていることから読み解くに
4
- 「bitflyer.py の中()に
4
+ 「bitflyer.py の中(下の方)に
5
5
  print(ticker_data)
6
6
  のような形にして
7
7
  ticker_data の"内容を表示したい”」
@@ -11,7 +11,7 @@
11
11
 
12
12
  なお、下記の場合 **main.py は無関係になるので、main.py の実行は不要**であり、
13
13
  **bitflyer.py を実行**すればよいです。
14
- (「bitflyer.py の中()に」print(ticker_data)と入れてticker_data の内容を表示したい、とのことですから当然といえば当然ですが)
14
+ (「bitflyer.py の中(下の方)に」print(ticker_data)と入れてticker_data の内容を表示したい、とのことですから当然といえば当然ですが)
15
15
 
16
16
  bitflyer.py
17
17
  ```py

6

 

2022/08/22 11:27

投稿

退会済みユーザー
test CHANGED
@@ -18,13 +18,11 @@
18
18
  import logging
19
19
  import websocket
20
20
  import json
21
-
22
- import pybitflyer
23
21
  import time
24
22
  from queue import Queue
25
23
  from concurrent.futures import ThreadPoolExecutor
26
24
 
27
- logger = logging.getLogger(__name__)#logging
25
+ logger = logging.getLogger(__name__)
28
26
 
29
27
  que = Queue() # データ受け渡しのためのキュー
30
28
 
@@ -81,7 +79,7 @@
81
79
  volume = float(resp['volume'])
82
80
  ticker = [product_code, timestamp, volume]
83
81
  # logger.info(f'ticker={ticker}')
84
- que.put(ticker) #= ticker#追記
82
+ que.put(ticker) #キューに ticker を入れる。
85
83
 
86
84
 
87
85
  def task():
@@ -89,15 +87,16 @@
89
87
  channel = "lightning_ticker_FX_BTC_JPY"
90
88
  RealtimeAPI(url=url, channel=channel)
91
89
 
90
+
92
91
  executor = ThreadPoolExecutor()
93
92
  executor.submit(task)
94
93
  try:
95
94
  while True:
96
- # キューからデータを取り出す。
95
+ # キューから ticker を取り出す。
97
96
  ticker_data = str(que.get())
98
- print(ticker_data) # ここでAPIから得たデータを表示
97
+ print(ticker_data) # ここでAPIから入ってくるtickerのデータを表示
99
98
  time.sleep(1)
100
99
  except KeyboardInterrupt:
101
100
  stop["status"] = True
102
- executor.shutdown()
101
+ executor.shutdown()
103
102
  ```

5

 

2022/08/22 11:25

投稿

退会済みユーザー
test CHANGED
@@ -3,15 +3,16 @@
3
3
  すなわち print と組み合わせていることから読み解くに
4
4
  「bitflyer.py の中(最下行)に
5
5
  print(ticker_data)
6
- と入れ
6
+ のような形にし
7
7
  ticker_data の"内容を表示したい”」
8
8
  と理解しました。
9
9
 
10
- これは、下記のようにすればできます。
10
+ これは、下記のようにマルチスレッドを使用すればできます。
11
11
 
12
12
  なお、下記の場合 **main.py は無関係になるので、main.py の実行は不要**であり、
13
13
  **bitflyer.py を実行**すればよいです。
14
14
  (「bitflyer.py の中(最下行)に」print(ticker_data)と入れてticker_data の内容を表示したい、とのことですから当然といえば当然ですが)
15
+
15
16
  bitflyer.py
16
17
  ```py
17
18
  import logging
@@ -25,7 +26,7 @@
25
26
 
26
27
  logger = logging.getLogger(__name__)#logging
27
28
 
28
- ticker_data = Queue() # データ受け渡しのためのキュー
29
+ que = Queue() # データ受け渡しのためのキュー
29
30
 
30
31
  stop = {"status":False} # 停止するためのフラグ
31
32
 
@@ -80,22 +81,23 @@
80
81
  volume = float(resp['volume'])
81
82
  ticker = [product_code, timestamp, volume]
82
83
  # logger.info(f'ticker={ticker}')
83
- ticker_data.put(ticker) #= ticker#追記
84
+ que.put(ticker) #= ticker#追記
84
85
 
85
86
 
86
87
  def task():
87
88
  url = "wss://ws.lightstream.bitflyer.com/json-rpc"
88
89
  channel = "lightning_ticker_FX_BTC_JPY"
89
- json_rpc = RealtimeAPI(url=url, channel=channel)
90
+ RealtimeAPI(url=url, channel=channel)
90
91
 
91
92
  executor = ThreadPoolExecutor()
92
93
  executor.submit(task)
93
94
  try:
94
95
  while True:
96
+ # キューからデータを取り出す。
97
+ ticker_data = str(que.get())
95
- print("--->"+str(ticker_data.get())) # ここでAPIから得たデータを表示
98
+ print(ticker_data) # ここでAPIから得たデータを表示
96
99
  time.sleep(1)
97
100
  except KeyboardInterrupt:
98
101
  stop["status"] = True
99
102
  executor.shutdown()
100
-
101
103
  ```

4

 

2022/08/22 11:21

投稿

退会済みユーザー
test CHANGED
@@ -19,9 +19,15 @@
19
19
  import json
20
20
 
21
21
  import pybitflyer
22
+ import time
23
+ from queue import Queue
24
+ from concurrent.futures import ThreadPoolExecutor
22
25
 
23
26
  logger = logging.getLogger(__name__)#logging
27
+
24
- ticker_data = 0#追記
28
+ ticker_data = Queue() # データ受け渡しのためのキュー
29
+
30
+ stop = {"status":False} # 停止するためのフラグ
25
31
 
26
32
  class RealtimeAPI(object):
27
33
 
@@ -46,6 +52,10 @@
46
52
  resp = json.loads(message)['params']['message']
47
53
  self.set_realtime_ticker(resp)
48
54
 
55
+ if stop["status"]:
56
+ # 停止フラグがTrueならwebsocketをクローズする。
57
+ self.ws.close()
58
+
49
59
  # when error occurs
50
60
  def on_error(self, ws, error):
51
61
  logger.error(error)
@@ -69,17 +79,23 @@
69
79
  product_code = resp['product_code']
70
80
  volume = float(resp['volume'])
71
81
  ticker = [product_code, timestamp, volume]
72
- print(ticker)
73
- logger.info(f'ticker={ticker}')
82
+ # logger.info(f'ticker={ticker}')
74
-
75
- global ticker_data#追記
76
- ticker_data = ticker#追記
83
+ ticker_data.put(ticker) #= ticker#追記
77
84
 
78
85
 
86
+ def task():
79
- url = "wss://ws.lightstream.bitflyer.com/json-rpc"
87
+ url = "wss://ws.lightstream.bitflyer.com/json-rpc"
80
- channel = "lightning_ticker_FX_BTC_JPY"
88
+ channel = "lightning_ticker_FX_BTC_JPY"
81
- json_rpc = RealtimeAPI(url=url, channel=channel)
89
+ json_rpc = RealtimeAPI(url=url, channel=channel)
90
+
91
+ executor = ThreadPoolExecutor()
92
+ executor.submit(task)
93
+ try:
82
- while True:
94
+ while True:
83
- print(ticker_data)#APIから入ってくるtickerのデータ表示される
95
+ print("--->"+str(ticker_data.get())) # ここでAPIから得たデータ表示
96
+ time.sleep(1)
97
+ except KeyboardInterrupt:
98
+ stop["status"] = True
99
+ executor.shutdown()
84
100
 
85
101
  ```

3

 

2022/08/22 11:06

投稿

退会済みユーザー
test CHANGED
@@ -80,6 +80,6 @@
80
80
  channel = "lightning_ticker_FX_BTC_JPY"
81
81
  json_rpc = RealtimeAPI(url=url, channel=channel)
82
82
  while True:
83
- print(ticker_data)#ここにAPIから入ってくるtickerのデータを入たいです
83
+ print(ticker_data)#APIから入ってくるtickerのデータが表示さ
84
84
 
85
85
  ```

2

 

2022/08/22 11:05

投稿

退会済みユーザー
test CHANGED
@@ -5,7 +5,7 @@
5
5
  print(ticker_data)
6
6
  と入れて
7
7
  ticker_data の"内容を表示したい”」
8
- と理解でき
8
+ と理解した
9
9
 
10
10
  これは、下記のようにすればできます。
11
11
 

1

 

2022/08/22 11:05

投稿

退会済みユーザー
test CHANGED
@@ -1,15 +1,18 @@
1
1
  コメントによるヒヤリングを経た結果
2
+ 「print(ticker_data)」のticker_dataにデータを入れたい、
3
+ すなわち print と組み合わせていることから読み解くに
2
4
  「bitflyer.py の中(最下行)に
3
5
  print(ticker_data)
4
6
  と入れて
5
- ticker_data の内容を表示したい」
7
+ ticker_data の"内容を表示したい
6
- のこと
8
+ 理解できます
7
9
 
8
- 下記のようにすればできます。
10
+ これは、下記のようにすればできます。
9
11
 
10
- なお、下記の場合main.pyは無関係になるので、main.pyの実行は不要で
12
+ なお、下記の場合 **main.py は無関係になるので、main.py の実行は不要**あり、
11
- bitflyer.py を実行すればよいです。
13
+ **bitflyer.py を実行**すればよいです。
12
14
  (「bitflyer.py の中(最下行)に」print(ticker_data)と入れてticker_data の内容を表示したい、とのことですから当然といえば当然ですが)
15
+ bitflyer.py
13
16
  ```py
14
17
  import logging
15
18
  import websocket