网络套接字线程



下面是使用 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()

如果你想生成一个新线程的原因是为了避免延迟,我会说不要被打扰。

在过去的 2 个月里,我一直在 MariaDB 服务器上使用 mysql-client(MySQLDB 连接器(,以完整模式订阅了 100+ 种工具,并且在将即时报价写入数据库时没有延迟。

此外,我们不知道一旦我们启动股票代码,我们何时以及会收到多少即时报价。这使得计时/计数和关闭线程和数据库连接变得困难。最终可能会耗尽连接限制和线程#非常快。(数据库连接池在这里是矫枉过正(

我使用 MySQLDB 连接器而不是 pymysql 的原因 - 在使用 pymsql 时,我看到写入时间增加了大约 20%。这在实时蜱虫中并不明显。我克隆了一个中等大小的数据库(1 Mill+ 行(,将其转储到 python 中的数据帧,然后将其逐行写入另一个数据库,工作台标记了 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(( 生成新线程,请使用 _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
  1. 导入队列和线程

  2. on_tick(( 将数据插入队列

  3. store_ticks方法包含要保存到数据库和清除队列的代码

  4. 启动另一个 Deamon 线程,共享队列中的数据并store_ticks

PS:很懒得打开编辑器和写代码

最新更新