首页 > 解决方案 > Python:通过 Flask-socketio 获取队列并发出消息,这可以用 While True 吗?

问题描述

我有一些工作代码,它从队列中获取数据,对其进行处理,然后通过 Flask-socketio 将数据发送到浏览器。

这在没有太多消息要发出时有效,但是当工作量增加时它根本无法应对。

此外,我尝试在不传输的情况下处理队列,这似乎工作正常。

因此,我希望做的不是每次 queue.get() 触发时都发出,而是在每次 ping 上简单地发出当前数据集的任何内容。

从理论上讲,这应该意味着即使 queue.get() 在 ping 和 pong 之间多次触发,正在发送的消息应该保持不变并且不会使系统过载。

这意味着当然不会发送一些数据,但应该发送上次 ping 时的最新数据,这足以满足我的需要。

希望这是有道理的,等等(某种工作)代码......

这在没有很多消息要发出时有效(socketio sleep 需要在那里,否则在它尝试发出之前不会发生处理):

def handle_message(*_args, **_kwargs):

    try:
        order_books = order_queue.get(block=True, timeout=1)
    except Empty:
        order_books = None
        market_books = market_queue.get()

    uo = update_orders(order_books, mkt_runners, profitloss, trading, eo, mb)
    update_market_book(market_books, mb, uo, market_catalogues, mkt_runners, profitloss, trading)
    socketio.sleep(0.2)
    emit('initial_market', {'message': 'initial_market', 'mb': json.dumps(mb), 'ob': json.dumps(eo)})
    socketio.sleep(0.2)
    emit('my_response2', {'message': 'pong'})

def main():
    socketio.run(app, debug=True, port=3000)
    market_stream.stop()
    order_stream.stop()

if __name__ == '__main__':
    main()

这有效(但我不想在这里发出任何消息,这只是从队列中获取和处理的 Python 脚本):

while True:
    try:
        order_books = order_queue.get(block=True, timeout=1)
    except Empty:
        order_books = None
        market_books = market_queue.get()

    uo = update_orders(order_books, mkt_runners, profitloss, trading, eo, mb)
    update_market_book(market_books, mb, uo, market_catalogues, mkt_runners, profitloss, trading)
    print(mb)

(最后的 mb 是当前数据集,由 update_market_book 函数返回)。

现在,我希望,通过While True最后,它可以简单地运行,并且该函数将在每次 ping 时返回最新的数据集,但是使用上面的方法,只有在函数被取出While True时才会触发......这当然会停止mainsocketio 部分无法正常工作。

那么,有没有一种方法可以将这两者结合起来,以实现我想要做的事情和/或有没有我认为可能有效的替代方法?

一如既往,感谢您的建议,如果问题不清楚,请告诉我,以便我澄清任何问题。

非常感谢!

只需按要求添加堆栈跟踪:

Traceback (most recent call last):
  File "D:\Python37\lib\site-packages\betfairlightweight\endpoints\login.py", line 38, in request
    response = session.post(self.url, data=self.data, headers=self.client.login_headers, cert=self.client.cert)
  File "D:\Python37\lib\site-packages\requests\api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "D:\Python37\lib\site-packages\requests\api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "D:\Python37\lib\site-packages\requests\sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "D:\Python37\lib\site-packages\requests\sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "D:\Python37\lib\site-packages\requests\adapters.py", line 449, in send
    timeout=timeout
  File "D:\Python37\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "D:\Python37\lib\site-packages\urllib3\connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "D:\Python37\lib\site-packages\urllib3\connectionpool.py", line 839, in _validate_conn
    conn.connect()
  File "D:\Python37\lib\site-packages\urllib3\connection.py", line 332, in connect
    cert_reqs=resolve_cert_reqs(self.cert_reqs),
  File "D:\Python37\lib\site-packages\urllib3\util\ssl_.py", line 279, in create_urllib3_context
    context.options |= options
  File "D:\Python37\lib\ssl.py", line 507, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "D:\Python37\lib\ssl.py", line 507, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "D:\Python37\lib\ssl.py", line 507, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 489 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

标签: pythonwebsocketqueueflask-socketio

解决方案


推荐阅读