繁体   English   中英

Websocket线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM