问题标签 [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 投票
1 回答
2248 浏览

python - 在异步协议/服务器之间进行通信

我正在尝试编写一个服务器端事件服务器,我可以使用 telnet 连接它并将 telnet 内容推送到浏览器。使用 Python 和 asyncio 背后的想法是使用尽可能少的 CPU,因为这将在 Raspberry Pi 上运行。

到目前为止,我有以下使用此处找到的库:https : //pypi.python.org/pypi/asyncio-sse/0.1,它使用 asyncio。

我还复制了一个也使用 asyncio 的 telnet 服务器。

两者分开工作,但我不知道如何将两者结合在一起。据我了解,我需要从里面调用类send(),但我不知道如何访问它。这两个“服务器”都需要循环运行以接受新连接或推送数据。SSEHandlerTelnet.data_received

任何人都可以帮忙,或指出我另一个方向吗?

0 投票
2 回答
4647 浏览

python - 获取异步服务器以调用另一台服务器

所以我修改了异步客户端和服务器的示例(在这里找到:https ://docs.python.org/3/library/asyncio-protocol.html#protocol-example-tcp-echo-server-and-client )和我想要的只是让client.py调用serverone.py,然后调用servertwo.py。

客户端.py

serverone.py

服务器二.py

我启动servertwo.pyserverone.py在终端中,然后调用client.py. 部分工作;客户端确实调用了调用 servertwo 的 serverone,但随后 serverone 失败并出现以下错误:

该文档没有涵盖很多奇怪的用例,所以我有点卡住了。我应该asyncio.async用来打电话吗?我是否正确地解决了这个问题?

我该如何解决或避免RuntimeError

0 投票
2 回答
6454 浏览

sockets - 如何让我的异步客户端调用套接字服务器并等待响应

我正在使用asyncio.Protocol服务器,其目的是让客户端调用服务器,但要等到服务器响应并返回数据,然后再停止客户端循环。

基于此处的 asyncio doc Echo Client and Server:https ://docs.python.org/3/library/asyncio-protocol.html#protocol-example-tcp-echo-server-and-client,transport.write的结果(...) 在调用时立即返回。

根据经验,呼叫loop.run_until_complete(coroutine)失败RuntimeError: Event loop is running.

asyncio.sleep(n)在服务器的方法中运行data_received()也没有任何效果。

yield from asyncio.sleep(n)yield from asyncio.async(asyncio.sleep(n))data_received()两者中挂起服务器。

我的问题是,如何让我的客户在交还控制权之前等待服务器写响应?

0 投票
2 回答
29660 浏览

python - Python asyncio.Lock() 有什么用?

是不是因为协程将来可能会被抢占?或者它允许人们在关键部分使用产量(不应该鼓励 IMO)?

0 投票
2 回答
1371 浏览

python - Python:实现并发 DNS 请求(流水线)

我正在尝试编写一个发送多个 DNS 请求的 python 脚本,每个请求使用不同的名称服务器。

使用 dnspython 实现顺序解决方案很容易,但对我来说太慢了。使用线程池添加并发是不可能的,因为在我的特殊情况下,所有请求都使用相同的源端口(REUSE_ADDRESS 在这里也无济于事)。

由于上述原因,我正在考虑使用以下解决方案(放弃使用 dnspython 的解析器模块,但利用其消息构建和解析模块):

  • 最多允许进行 X 个请求
  • 同时发送 X 个请求(仅使用 udp 发送 dns 请求数据包。可能会在发送之间增加延迟以避免突发)
  • 另一个线程等待响应
  • 当响应到达时,将其与请求匹配(按地址)并允许新请求运行
  • 如果对请求的响应未在 TIMEOUT 秒内到达,则将其标记为已完成并允许运行新请求

我的主要问题是:

  • 如何轻松实现任务超时
  • 是否可以在不使用线程同步的情况下实现它(例如使用事件循环?)
  • 是否有任何现有的库可以帮助实现它(感觉就像我在这里试图重新发明轮子,我查看了 asycnio 模块但无法找到一种方法来利用它来解决我的问题)。请注意,我不想使用现有的 dns 或网络库,因为我需要灵活地更改核心功能(例如,使用原始套接字、更改 DNS 标头字段等)。
0 投票
1 回答
10142 浏览

python - 如何在 asyncio 上重新连接套接字?

我想在 app.py 上使用 asyncio 创建两个协议(TcpClient 和 UdpServer),其中 TcpClient 将与 server.py 和 UdpServer 作为 UDP 服务器建立持久连接:

我需要什么:
a) 两种协议进行通信:互相调用方法。这仅适用于第一个连接。如果 TcpClient 重新连接,它不能再次发送字符串“send to tcp”。来自 UdpServer。我检查print(self)并 TcpClient 创建了一个新实例,旧实例仍然存在但没有连接,但我不知道如何重构它。我认为我以错误的方式使用 asyncio。
b) 当 TcpClient 与 server.py 断开连接时,等待 5s 并尝试重新连接,以此类推。我尝试使用call_later()asyncio,但我认为有一种本地方法可以做到这一点,而不是一种技巧。
c)当我启动 app.py 时,如果 TcpClient 无法连接,我想在 5 秒后尝试重新连接,依此类推。我不知道该怎么做。

这里是我对 app.py server.py 的示例测试。server.py 仅用于测试 - 这将是另一种语言。

只是说我尝试过:
1)当我启动 app.py 并且 server.py 关闭时,app.py 不要重试。
2)当app.py连接到server.py并且服务器关闭并快速启动时,TcpClient重新连接,但我不能更多地在新实例上连接其他方法并发送字符串“send to tcp”。到 server.py,只是旧的,没有更多的连接。
3)如果我asyncio.async()改用,run_until_complete()我不能从其他协议调用方法。

我把 app.py 和 server.py 放在这里,所以你可以复制并运行测试。

ncat localhost 9000 -u -v用来发送字符串“send to tcp.”。该字符串需要打印在 UdpServer 类上并传递给 TcpClient 类的方法 send_data_to_tcp,该方法会将字符串发送到 server.py。<- 这在第一次重新连接 tcpClient 后不起作用。

我正在使用 Python 3.4.0。

太感谢了。

应用程序.py:

服务器.py:

0 投票
2 回答
1383 浏览

python - websocket + wamp:服务器php和客户端python,tcp连接断开

我正在开发一个 python3.3 客户端:我需要连接到一个 ratchet-wamp php 服务器并订阅一个主题。我已经安装了 asyncio 和高速公路。

我遵循此示例https://github.com/tavendo/AutobahnPython/blob/master/examples/asyncio/wamp/beginner/client.py但它不起作用,握手后 tcp 连接断开。

激活所有调试结果是:

服务器正常(与它连接的另一个应用程序)。有什么建议吗?谢谢!

0 投票
2 回答
1719 浏览

python - 如何保证使用 python asyncio 发送的 tcp 数据?

我有一个客户端连接到服务器并发送列表中的所有消息,并且发送的每条消息都会从列表中删除。

但是当我强制关闭服务器时,客户端仍然继续从列表中发送和删除消息。我希望如果连接断开,客户端停止发送消息,或者如果不能保证服务器已收到消息,则不要从列表中删除。

我检查当我在连接断开后发送超过四条消息时,显示错误“socket.send() 引发异常”。但我不知道如何得到那个错误,我认为它是异步的。无论如何,如果我收到该错误,如果列表在连接断开后发送的消息少于五条,则不会发生该错误。

Ps:我写服务器只是为了我的测试,但是我将无法访问服务器。因此,需要尽一切努力保证数据发送的客户端。

太感谢了。

客户端.py

服务器.py

服务器输出(在收到 msg4 后强制 (CTRL+C) 关闭服务器):

客户端输出

0 投票
1 回答
9367 浏览

python - 为什么异步库比这个 I/O 绑定操作的线程慢?

我正在编写一个用于枚举站点域名的python 程序。例如,'a.google.com'。

首先,我使用该threading模块来执行此操作:

后来,我读了一本书,它说在某些情况下协程比线程快。所以,我重写了要使用的代码asyncio

为什么asyncio版本 getaddrinfo这么慢?我是否以某种方式滥用协程?

0 投票
2 回答
47151 浏览

python - 可以在不暂停 Python 解释器的情况下在后台运行异步事件循环吗?

asyncio 的文档提供了两个示例,说明如何每两秒打印一次“Hello World”: https ://docs.python.org/3/library/asyncio-eventloop.html#asyncio-hello-world-callback https:// docs.python.org/3/library/asyncio-task.html#asyncio-hello-world-coroutine

我可以从解释器中运行它们,但如果我这样做了,我将无法访问解释器。可以在后台运行异步事件循环,以便我可以继续在解释器中输入命令吗?