当前位置: 首页 > 知识库问答 >
问题:

添加项目时,超时的Python queue.get(block=true)不返回

白子默
2023-03-14

我的python应用程序中有2个线程。线程A(基本上是“主”线程)被添加到队列中。线程B正在从队列中获取它。

代码A:

def addTrade(self, date, volume, price, exchange):
    '''
    Adds a single trade to the database
    '''
    print "> ADD"
    try:
        self._incomingDataQueue._put(TradeData(exchange=exchange, date=date, volume=volume, price=price))
        # self._dataAvailableEvent.set()
        # self._dataAvailableEvent.clear()
        print "< ADD"
    except Exception as ex:
        print "ex: %s" % ex

线程B具有以下特性:

print "> GET"
t = int(time.time())
tradeData = self._incomingDataQueue.get(block=True, timeout=20)
print "< GET %d " % (int(time.time()) - t)

所以。。。

发生的事情是这样的:线程B被启动并等待队列中的一个项目(超时=20秒)。几乎在B启动后的瞬间,一个项目被添加到队列中。15秒后另一个项目。

但是:进入队列仅在 20 秒后重新调整。我希望当新数据可用时,它会“几乎立即”返回。

输出:

> GET
> ADD
< ADD
> ADD
< ADD
< GET 20

那么,这是队列的正常行为吗?还是我应该使用另一种机制?

提前感谢!

共有1个答案

彭存
2023-03-14

问题是你调用的是Queue._put而不是Queue.put。我看不出你为什么要这样做。

前导下划线表示< code>_put方法不是类< code>Queue的公共接口的一部分,因此您不应该直接调用它。

 类似资料:
  • 我正试图将一个Grails项目导入到STS中。我在运行STS 3.6.1。我还安装了Groovy插件,运行编译器1.8.6。最后,我有了Grails2.1.4。 但是,当我试图导入一个Grails项目(它是一个Subversion存储库)时,在最终放弃之前,它非常缓慢: 参见菜单窗口>>首选项>>Grails>>启动命令:C:\program files\java\jdk1.6.0_45\bin\

  • 我有下面的类,其中包含一个bank帐户的列表。我还有另一个问题,我用方法将许多银行帐户添加到特定的AssignmentIban中。但是问题是我有这个错误 java.lang.不支持操作异常:null atjava.util.AbstractList.add(AbstractList.java:148) atjava.util.AbstractList.add(AbstractList.java:1

  • 我正在将Firebase添加到我的应用程序中,以使用Crashlytics。这很好,但当我按照官方指南安装它时,我从Gradle那里得到了错误,google play服务找不到。为什么它告诉我找不到? 我的应用程序运行最新的Gradle“v3.4.1”,我搜索了这个问题,得到了这个答案: 因此,作为一个快速解决方案,我添加了另一个存储库: 链接:错误:找不到com。谷歌。gms:google se

  • 问题内容: 我有一种用于在本地主机上执行命令的方法。我想向该方法添加一个超时参数,以便如果被调用的命令没有在合理的时间内完成,则该方法将返回错误代码。这是到目前为止的样子,无法超时: 谁能为我提出一种实现超时参数的好方法? 问题答案:

  • 我试过使用descendantFocusability=“blocksdescendents”,但这不起作用。 这是我的XML代码,可以在其中找到RecyclerView 用于向RecyclersView添加数据的代码是 所有应用程序都工作得很好,唯一的问题是滚动行为。当我在HIM中添加新数据时,我希望滚动位置不会出现在RecyclersView列表的顶部。

  • 我已经在Cordova项目上创建了,但在添加平台时,它给了我以下错误: 将cordova fetch用于cordova android@6.3.0 错误: