Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阻止执行直到出现条件_Python_Multithreading_Python 2.7_Python 3.x_Eventlet - Fatal编程技术网

Python 阻止执行直到出现条件

Python 阻止执行直到出现条件,python,multithreading,python-2.7,python-3.x,eventlet,Python,Multithreading,Python 2.7,Python 3.x,Eventlet,我使用的是eventlet,有两个主要进程正在运行。其中一个过程充当生产者,另一个充当消费者。问题是,我不想使用eventlet包中的队列,而是想使用db。 使用queue我可以简单地传递(block=True)作为参数,eventlet将负责阻塞消费者例程的执行,直到生产者将某些内容放入队列。 如果我用db替换队列,我如何有效地实现阻塞逻辑 每N秒查找一次以DB为单位的数据。如果什么也没找到——睡觉 更新:或使用Postgresql侦听/通知机制(如所示)作为背景,您可能希望阅读这篇维基百科文

我使用的是eventlet,有两个主要进程正在运行。其中一个过程充当生产者,另一个充当消费者。问题是,我不想使用eventlet包中的队列,而是想使用db。 使用queue我可以简单地传递(block=True)作为参数,eventlet将负责阻塞消费者例程的执行,直到生产者将某些内容放入队列。
如果我用db替换队列,我如何有效地实现阻塞逻辑

每N秒查找一次以DB为单位的数据。如果什么也没找到——睡觉


更新:或使用Postgresql侦听/通知机制(如所示)作为背景,您可能希望阅读这篇维基百科文章:

我建议在这两个进程之间使用套接字连接。通过这种方式,您可以轻松地发送一些数据和唤醒信号。请注意,TCP并没有消息的概念(作为一个整体发送和传递的信息),所以您必须实现一个简单的协议来实现这一点。我建议使用tnetstring[1]。另一种方法是使用ZeroMQ,因为它提供消息。Eventlet提供了对这两种方式的出色支持

您可能需要生产者/消费者上的事务作业语义,如中所示:任何数据段要么被某个消费者完全处理,要么失败,需要重复尝试或人工关注。然后,您必须使用某种数据库处理事务。有现成的解决方案:芹菜[2],豆茎[3],柴堆[4]

  • [1]
  • [2] 我不喜欢它是“任务队列的django”[3],但它完成了任务,如果您需要任务队列,它可能是最好的选择。在这种情况下,django是一个不必要的复杂,不能专注于几个明确的问题,企业式创造就业机会的同义词,因为学习该工具需要花费大量时间和精力
  • [3]
  • [4]

我想一把简单的锁就可以了。但是为什么你想使用数据库而不是队列呢?直到现在我还在使用eventlet.queue.LightQueue。我之所以想到db,是因为在某些情况下,我的消费者还必须向制作人发送类似于思考的回复。我认为db中的记录更适合双向通信。那么为什么不使用两个队列呢?一个用于发送,一个用于回复?我正在考虑所有选项。我还想知道阻塞逻辑是如何在队列中实现的。每隔几秒钟使用time.sleep看起来是一种低效的方法。应该还有其他更好的方法。我发现这个页面可能会有所帮助。据我所知,所有并发实现都不使用time.sleep。他们用notify代替。这意味着您等待的线程正在休眠,直到另一个线程将其唤醒。这就像在等待一个命令。你只是在等待别人通知你。轮询方法存在一个平衡问题:要么你睡得太多而浪费时间,要么你睡得太少而浪费CPU/网络资源。这只是理论上的问题。对于DB和您的服务器来说,每100毫秒拉一次DB应该算不了什么。如果100ms的延迟太大,问题的作者应该问,当有很多专门的解决方案(RabbitMQ和其他)时,他为什么要在数据库中创建队列@AlexDvoretsky您的答案肯定是解决此问题常用的方法之一。虽然我在问题中没有提到,但我已经意识到了这一点。队列或DB在我的脑海中肯定是一个想法(我的问题比我在最初的问题中提到的要多得多),但我的实际意图是找到实现阻塞逻辑的最有效方法。你说你想使用DB。db上没有任何魔法阻塞。线程(实数或绿色)可以阻塞套接字I/O和特殊操作系统原语,如信号量。对于db,只有一种方法——pull it。PostgreSQL具有侦听/通知机制和建议锁,可用于实现高效阻塞。所有数据库都有显式表锁,可以像这样使用:producer锁表,并在准备就绪时插入一行。使用者锁定表并选择,然后删除一行。它实际上是一个以数据库作为后端实现的队列。所以,同样,现成的解决方案也可以做同样的事情,但它们已经准备好并经过测试。