python - 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
时才会触发......这当然会停止main
socketio 部分无法正常工作。
那么,有没有一种方法可以将这两者结合起来,以实现我想要做的事情和/或有没有我认为可能有效的替代方法?
一如既往,感谢您的建议,如果问题不清楚,请告诉我,以便我澄清任何问题。
非常感谢!
只需按要求添加堆栈跟踪:
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
解决方案
推荐阅读
- xslt - XSL 中的替换功能问题
- c# - 你可以在 Xamarin.Forms 中使用 Firebase.Auth 吗?
- python - 将行转置为python列
- android - Kotlin Android 扩展:java.lang.IllegalStateException:视图不能为空
- buffer - Vulkan,多个对象的相同统一缓冲区?
- nativescript - Nativescript - Android TabView 后退按钮自定义导航
- javascript - React-Redux - 在组件中的另一个请求中使用来自 componentDidMount 中的获取请求的响应
- clojure - 拆分字符串时clojure java.lang.NullPointerException
- node.js - Nodejs识别客户端ssl
- ios - 如何将可映射对象保存到 nsuserdefault?