Websocket 线程
Posted
技术标签:
【中文标题】Websocket 线程【英文标题】:Websocket Threading 【发布时间】:2018-10-18 02:11:35 【问题描述】:以下是使用 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()
【问题讨论】:
【参考方案1】:如果您想要生成一个新线程的原因是为了避免延迟,我想说不要打扰。
在过去的 2 个月里,我一直在将 mysql-client(MySQLDB 连接器)与 MariaDB 服务器一起使用,以完整模式订阅了 100 多种仪器,并且在将刻度写入 DB 方面没有任何延迟。
此外,我们不知道一旦我们开始计时,我们会收到多少计时。这使得计时/计数和关闭线程和数据库连接变得困难。最终可能会很快耗尽连接限制和线程#。 (数据库连接池在这里有点过分了)
我使用 MySQLDB 连接器而不是 pymysql 的原因 - 我看到使用 pymsql 时写入时间增加了大约 20%。这在实时滴答声中并不明显。我克隆了一个中型数据库(1 Mill+ 行),将其转储到 python 中的 Dataframe 中,然后将其逐行写入另一个数据库,并在 bench 上标记了 10 次迭代的结果。
我使用 MariaDB 的原因 - MySQL 企业版的所有功能,无需 Oracle 大惊小怪。
只需确保为您使用的数据库服务器设置适当的内存量即可。 这为数据库的缓冲区创造了一个喘息的空间,以防万一。 避免使用远程服务器并坚持使用本地服务器也有很大帮助。 如果您想将数据从本地备份到云备份,您可以设置一个日常工作以转储到本地,导出到云端并加载到那里的数据库
如果您正在寻找演练,这个page 已经有一个示例,以及一个代码演练视频。
编辑: 我刚刚公开了我的代码here
【讨论】:
【参考方案2】:您可以将 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
【讨论】:
这将是同步的。我想让它异步!! 哦!我的错误,我误解了这个问题。以上是关于Websocket 线程的主要内容,如果未能解决你的问题,请参考以下文章