[英]Duplicated message for websocket in multi-threading and while loop
[英]Websocket Threading
下面是使用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()
如果您想产生一个新线程的原因是避免延迟,那么我就不要打扰。
在过去的两个月中,我一直在将MariaDB服务器与mysql-client(MySQLDB连接器)配合使用,在完全模式下订阅了100多种工具,并且没有将滴答滴答写入数据库的延迟。
同样,我们不知道启动股票行情记录的时间和数量,这使得计时/计数和关闭线程与数据库连接变得困难。 可能很快耗尽连接限制和线程#。 (数据库连接池在这里是过大的选择)
我使用MySQLDB连接器而不是pymysql的原因-使用pymsql时,写入时间增加了大约20%。 这在实时报价中并不明显。 我已经克隆了一个中等大小的数据库(1 Mill +行),将其转储为python中的Dataframe,然后将其逐行写入另一个DB,并标记了10次迭代的结果。
我之所以使用MariaDB-MySQL企业版的所有功能,而没有Oracle大惊小怪。
只需确保为使用的数据库服务器设置了相当数量的内存即可。 以防万一,这为数据库的缓冲区创造了喘息的空间。 避免使用远程服务器并坚持使用本地服务器在很大程度上也有帮助。 如果要将数据从本地备份备份到云备份,则可以设置每日作业以转储到本地,导出到云并在此处加载到数据库
如果您正在寻找完整的部署,此页面已经有一个示例,以及通过视频的代码遍历。
您可以将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(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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.