下面是使用WebSocket接收实时报价的代码。每次收到报价时,都会调用on_ticks()回调函数,它将打印报价。
我可以在on_ticks()函数中生成单个线程并调用store_ticks()函数以将刻度保存在数据库中吗?如果是,请有人帮忙并说明如何完成?还是有其他方法可以调用store_ticks()函数并在每次收到报价时存储报价?
from kiteconnect import KiteTicker
kws = KiteTicker("your_api_key", "your_access_token")
def on_ticks(ws, ticks):
print(ticks)
def on_connect(ws, response):
# Callback on successful connect.
# Subscribe to a list of instrument_tokens
ws.subscribe([738561, 5633])
def store_ticks():
# Store ticks here
def on_close(ws, code, reason):
# On connection close stop the main loop
# Reconnection will not happen after executing `ws.stop()`
ws.stop()
# Assign the callbacks.
kws.on_ticks = on_ticks
kws.on_connect = on_connect
kws.on_close = on_close
kws.connect()
答案 0 :(得分:1)
如果您希望生成新线程的原因是避免延迟,那么请不要打扰。
在过去的两个月中,我一直在将MariaDB服务器与mysql-client(MySQLDB连接器)配合使用,在完全模式下订阅了100多种工具,并且没有将滴答写入数据库的时间。
此外,我们不知道启动股票行情收录器的时间和数量,这使得计时/计数和关闭线程与数据库连接变得困难。可能很快耗尽连接限制和线程#。 (数据库连接池在这里太过分了)
我使用MySQLDB连接器而不是pymysql的原因-使用pymsql时,写入时间增加了大约20%。这在实时报价中并不明显。我已经克隆了一个中等大小的数据库(1 Mill +行),将其转储到python中的Dataframe中,然后将其逐行写入另一个DB,并标记了10次迭代的结果。
我使用MariaDB的原因-MySQL企业版的所有功能,而无需Oracle大惊小怪。
只需确保为使用的数据库服务器设置了相当数量的内存。 以防万一,这为数据库的缓冲区创造了喘息的空间。 避免使用远程服务器并坚持使用本地服务器在很大程度上也有帮助。 如果要将数据从本地备份备份到云备份,则可以设置日常作业以转储到本地,导出到云并在那里加载到数据库
如果您正在寻找完整的部署,此page已经有一个示例,以及通过视频的代码遍历。
答案 1 :(得分:0)
您可以将store_ticks()
函数修改为
def store_ticks(ticks):
# code to store tick into database
,然后将您的on_ticks
函数修改为:
def on_ticks(ws, ticks):
print(ticks)
store_ticks(ticks)
store_ticks(ticks)
中的内容取决于您要使用的数据库以及要在其中存储的确切信息。
编辑:
要为store_ticks()生成新线程,请使用_thread模块:
import _thread
def store_ticks(ticks):
# code to store tick into database
def on_ticks(ticks):
print(ticks)
try:
_thread.start_new_thread(store_ticks, (ticks,))
except:
# unable to start the thread, probably want some logging here