问题标签 [python-asyncio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
14248 浏览

python - asyncio:是否可以取消由 Executor 运行的未来?

我想使用异步调用 loop.run_in_executor 在 Executor 中启动一个阻塞函数,然后稍后取消它,但这似乎对我不起作用。

这是代码:

我希望上面的代码只允许阻塞函数输出:

然后查看非阻塞函数的输出。但是相反,即使在我取消之后,阻塞的未来仍在继续。

可能吗?还有其他方法吗?

谢谢

编辑:更多关于使用 asyncio 运行阻塞和非阻塞代码的讨论:How to interface blocking and non-blocking code with asyncio

0 投票
3 回答
7012 浏览

python - 使用 asyncio 监视文件

我正在尝试找出一种使用Python 的 asyncio library来观察文件外观的好方法。到目前为止,这是我想出的:

我将它保存为watch_for_file.py,并且可以运行它

在另一个 shell 会话中,我发出

结束循环。

有没有比使用这个无限循环更优雅的解决方案yield from asyncio.sleep()

0 投票
2 回答
1694 浏览

python - asyncio:是否可以在不使用 yield from 的情况下释放对事件循环的控制?

我想知道是否有任何方法可以在函数中释放 asyncio 控制循环一段时间,而不必使用协程装饰器和 yield from 关键字?

我希望能够做到这一点,以便可以从对 asyncio 一无所知的代码中调用 do_something_periodically 方法,但会在睡眠期间释放循环控制。这可能吗?

谢谢!

编辑以显示我的特定用例的精简版本

0 投票
1 回答
3917 浏览

python - Python 3 asyncio - 从 vs asyncio.async 堆栈使用中产生

我正在使用 Python 3 asyncio 框架评估定期执行的不同模式(为简洁起见省略了实际的睡眠/延迟),并且我有两段行为不同的代码,我无法解释原因。正如我所料,第一个版本用于yield from递归调用自身,在大约 1000 次迭代中耗尽堆栈。第二个版本递归调用协程,但将实际的事件循环执行委托给asyncio.async堆栈并且不会耗尽堆栈。你能详细解释为什么第二个版本没有使用堆栈吗?执行这个协程的两种方式有什么区别?

第一个版本(来自):

第二个版本(asyncio.async):

0 投票
1 回答
1147 浏览

python - 在 Python 中使用 asyncio 并行化 Web 任务

我正试图围绕 asyncio 和 aiohttp 进行思考,多年来编程第一次让我感到完全愚蠢和无能。这有点漂亮,以一种奇怪的禅宗方式。但是,唉,还有工作要做。

我有一个现有的课程,可以在网络上做许多奇妙的事情,比如注册一个网站、获取数据、工作。现在我需要 100 或 1000 只这样的小工蜂来注册。代码大致如下:

如您所见,我们使用 requests 模块发出 POST 请求。然而这是阻塞的,所以我们必须等待工人 N 完成注册,然后才能开始注册工人 N+1。幸运的是,Worker 类的原作者(听起来很迷人的马克思主义者)以她无限的智慧将每个 HTTP 调用封装在self.make_request方法中,因此使整个 Worker 非阻塞应该只是将请求库换成非阻塞的问题一个 aaaa 和鲍勃是你的叔叔,对吧?这是我走了多远:

但这会在我做AttributeError: 'generator' object has no attribute 'get'的方法中引发一个问题。除此之外,我仍然没有一本整洁的字典中的工人。我知道我很可能完全误解了 asyncio 的工作原理 - 但我已经花了一天时间阅读各种文档、David Beazly 的令人震惊的教程以及大量玩具示例,这些示例足以让我理解它们适用于这种情况很简单。我应该如何构建我的工作人员和我的异步循环以并行注册 100 个工作人员并最终在他们注册后获得所有工作人员的列表?signupself.user_id = data.get("user_id")

0 投票
1 回答
3133 浏览

python - 在 Gtk 主循环中运行的异步调用

好吧,伙计们关于 asyncio 和 Gtk+ 的问题。如何在 Gtk.main 循环中运行以下代码?例如,我搜索但找不到任何东西。

编辑:

好吧,我应该写下我对 gbulb 的体验。首先,我使用 pip3 搜索它。我找到它并尝试安装它,但由于链接错误,它失败了(我使用超级用户进行安装)。接下来,我从他们的存储库下载并安装了它。我得到了这个示例,我运行它并得到了一些错误,因为他们的核心模块中缺少参数。我真的不知道是哪个错误导致我从不同的 PC 写这个我会更新是尽快。如果其他人可以测试它,我将不胜感激。

0 投票
2 回答
1690 浏览

python - 如何使用高速公路异步实现交互式 websocket 客户端?

我正在尝试使用 autobahn|python 和 实现一个 websocket/wamp 客户端asyncio,虽然它有些工作,但有些部分让我无法理解。

我真正想做的是在 qt5/QML 中实现 WAMP,但目前这似乎是一条更简单的路径。

这个主要从网上复制的简化客户端确实有效。它在发生时读取时间服务onJoin

我想做的是从外部来源触发此读取。

我采用的复杂方法是asyncio​​在线程中运行事件循环,然后通过套接字发送命令以触发读取。到目前为止,我无法弄清楚将例程/协程放在哪里,以便可以从阅读器例程中找到它。

我怀疑有一种更简单的方法可以解决这个问题,但我还没有找到。欢迎提出建议。

0 投票
2 回答
788 浏览

python - 在 ApplicationSession 的注册端点中访问 RPC 调用者的 IP 和 HTTP 连接标头

我将 Autobahn 0.9.2 与 Python 3.4 与 asyncio 一起使用。

问题:使用 WAMP,是否可以从 RPC 端点内部访问充当呼叫者的 IP 和 HTTP 连接标头的对等方?建立连接时是否保留此信息?如果没有,我将如何开始扩展一些工厂来支持这一点?

我的目标很简单:我想要一个 RPC 端点来地理定位连接的对等点(调用者)的 IP,并将增强的数据中继到 Redis。我已经阅读了源代码并且知道信息从哪里通过(autobahn.websocket.protocol.WebSocketServerProtocol -> onConnect(request)),但是我无法从 onJoin 回调中定义的 ApplicationSession 的 RPC 端点向下钻取它。我尝试遍历传输/路由器/路由器会话链并没有设法到达那里。我对初始连接请求中的对等 IP 和 HTTP 标头都感兴趣。

这是蒸馏的组件:

以及服务器的初始化:

0 投票
1 回答
691 浏览

python-3.x - asyncio 流检查阅读器是否有数据

所以我想实现一个简单的通信协议,其中读写是完全异步的。这意味着客户端发送一些数据,然后服务器可能会或可能不会响应答案。所以我不能只是打电话reader.read(),因为这会阻塞,直到至少返回一些东西。与此同时,我可能还有更多东西要发送。

那么有没有办法检查读者是否有东西要阅读?(请注意,我专门讨论的是流版本:我完全知道协议版本具有用于读取和写入的单独处理程序,并且不会受到此问题的影响)

0 投票
1 回答
1450 浏览

python-3.x - 具有持久连接的异步

免责声明:这可能是一个非常基本的问题,但我只是不理解这个概念,因此无法实现我想要的。

我正在尝试使用 asyncio 实现基本的 echo 客户端服务器。我从文档中包含的示例开始。

我想要实现的是持久连接,客户端可以在任何时间而不是立即 connection_made向服务器发送一些数据,然后读取响应(如果有的话)。连接必须在两端保持打开状态,直到显式关闭。

我正在使用协议示例进行此操作。阅读其他问题/文档,似乎我可以使用 来实现这个loop.call_later(),但这真的是一个好的解决方案吗?理想情况下,我希望使用 aQueue能够立即响应新数据包。

我最终得到了这段代码,它是从“MyProtocol”调用的。初始化`:

但这无济于事。我假设当从主客户端代码插入新项目时,这会立即打印出消息。什么都没发生...

进一步调试显示队列正在被填满,但 out_queue.get() 协程永远不会返回。最初 out_queue.put 甚至将项目直接放入服务员中以进行初始 .get() 调用,但就好像循环没有运行一样。它与用于整个客户端连接的循环相同(我创建了一个新循环,因为我将所有内容都放入了一个线程中)。我已经检查过,从 .put() 调用中进行的适当调用都是针对这个循环的。

哦,以防万一:我在 python 3.3 上运行它,通过 pip 安装 asyncio。

更新:这就是我尝试将项目插入队列的方式:

print从不执行。