我编写了以下脚本,它连接到Websocket并从中接收一些数据。在运行此脚本时,我尝试每2秒运行一个函数。在这种情况下,该函数仅显示一条消息,但是当然是用于调试,它将在将来执行其他任务。
我的问题是Printer()
没有开始运行,我看不到每2秒出现一次该消息。我知道问题是Connect()
有其自己的线程,因此Printer()
在Connect()
停止工作之前不会被调度。我希望Printer()
运行while我正在从websocket接收数据。有什么办法吗?使它异步?使用更多线程?
import websocket, json, time, schedule, logging, cfscrape
from websocket import create_connection
try:
import thread
except ImportError:
import _thread as thread
MyList = []
MexCoinsToMonitor = ['XBTUSD']
LastOrder = format(float(time.time()), '.0f')
BU = cfscrape.create_scraper()
def process_message(ws,msg):
try:
message = json.loads(msg)
print(message)
except Exception as e:
print(e)
def Printer():
print('hello')
def on_error(ws, error):
print('Error')
def on_close(ws):
Checker()
def on_open(ws):
def run(*args):
for value in MexCoinsToMonitor:
tradeStr=""" {"op": "subscribe", "args": ["orderBookL2_25:%s"]} """%(value)
ws.send(tradeStr)
time.sleep(1)
thread.start_new_thread(run, ())
def Checker():
global LastOrder
TimeDiff = float(time.time()) - float(LastOrder)
print (LastOrder, TimeDiff)
if TimeDiff > 20:
ws = websocket.WebSocketApp("wss://www.bitmex.com/realtime", on_message = process_message, on_error = on_error, on_close = on_close)
ws.on_open = on_open
ws.run_forever()
def Connect():
websocket.enableTrace(False)
ws = websocket.WebSocketApp("wss://www.bitmex.com/realtime", on_message = process_message, on_error = on_error, on_close = on_close)
ws.on_open = on_open
ws.run_forever()
Connect()
schedule.every(2).seconds.do(Printer)
while True:
schedule.run_pending()
time.sleep(2)
要计划,我正在使用Schedule
模块。
您确实可以使其不同步。这将在连接工作时运行打印机。您可以为此使用线程模块。
import threading
threading.Thread(target=Printer).start()
那会启动打印机。比您可以连接而不必完成打印机。
如果要继续调用该函数,只需使用while循环。
import threading
import time
while True:
threading.Thread(target=Printer).start()
time.sleep(2)