簡體   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