我正在尝试使用2个异步函数创建一个Python生产者和使用者。其中一个函数是从服务器(生产者)获取数据的回调,另一个是每N秒执行一次(用户)执行的定时回调。我正在尝试为此使用ZMQ / Reactor,因为我想避免计时器线程的开销,而仅使用事件循环。 ZMQ / Reactor事件循环是否按到达顺序执行每个事件,还是有可能随时将使用者功能上下文切换到生产者功能?
简化示例:
主要问题是我无法弹出列表中的所有项目并自动清除
queue = []
def producer():
# gets data from server
queue.append(single_record)
def consumer():
records = list(queue)
# inserts records into db
queue.clear()
答案 0 :(得分:1)
Q :“事件期间ZMQ上下文可以切换吗?”
好吧,让我们从零禅宗的祖先开始-彼得·辛琴斯(Martin SUSTRIK)和马丁·苏斯特里克(Martin SUSTRIK)的体系结构从来没有向您保证过任何收到消息的保证,获得全部保证的保证就越少的“顺序”越少。
Zen-of-Zero中只有一项保修:如果我们确实发出.recv
消息,则肯定是原始消息的二进制完全相同的副本,该副本被分发为通过ZeroMQ发送。
ZeroMQ Context()
实例是一个独立的异步MQ引擎,这一事实无济于事,并且知道Python在Py2.x中每隔几百条伪指令都会切换其内部GIL锁所有权。还是Py3。+中的每5 [ms]都不能帮助您明确表示需要获得任何此类保证,对吗?
您还需要其他一些附加机制,这些机制可以弥补Python的空白,并在零禅的领土上架起缺失的保证。