Websocket线程

时间:2018-10-18 02:11:36

标签: python multithreading websocket

下面是使用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 个答案:

答案 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