回答編集履歴
15
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
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
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
|
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
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
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
test
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
コメントによるヒヤリングを経た結果
|
1
|
+
コメントによるヒヤリングを経た結果、結局
|
2
|
-
「print(ticker_data)」のticker_dataにデータを入れたい
|
2
|
+
「print(ticker_data)」のticker_dataにデータを入れたい」ということでした。
|
3
|
+
|
3
|
-
|
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
test
CHANGED
@@ -100,5 +100,7 @@
|
|
100
100
|
stop["status"] = True
|
101
101
|
executor.shutdown()
|
102
102
|
```
|
103
|
+
停止する場合はCTRL+Cを押してください。
|
104
|
+
try: ~ exceptで囲んでいるのは安全に停止するためです。
|
103
|
-
|
105
|
+
止めることができなくても構わない、というなら try ~ except で囲まなくてもいいですが・・・。
|
104
106
|
|
8
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
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 の中(
|
14
|
+
(「bitflyer.py の中(下の方)に」print(ticker_data)と入れてticker_data の内容を表示したい、とのことですから当然といえば当然ですが)
|
15
15
|
|
16
16
|
bitflyer.py
|
17
17
|
```py
|
6
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__)
|
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) #
|
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
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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
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 =
|
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から
|
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
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)#
|
83
|
+
print(ticker_data)#APIから入ってくるtickerのデータが表示される
|
84
84
|
|
85
85
|
```
|
2
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
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は無関係にな
|
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
|