![](/img/trans.png)
[英]Duplicated message for websocket in multi-threading and while loop
[英]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.