我试图用stream编写一个并发流处理程序,我想知道这是否是Python协同最有效的使用。asyncio包有大量的选项,但是很难确定项目的正确方法,我认为这些文档在解释每个项目的优缺点方面做得并不好。
我认为这里不需要多个线程的开销,我需要异步循环之间的相互通信。我应该为我的每个函数创建一个单独的BaseEventLoop吗?
作为Python,我认为这个问题(There should be one-- and preferably only one --obvious way to do it)有一个近乎确定性的答案,但我担心,添加所有这些异步巡洋舰可能只会使我的代码比完全顺序的天真实现更低
在Go语言中,以非阻塞的方式运行另一个任务非常简单。
import "net/http"
func Call(request http.Request) http.Response {
response := getResponse(request)
go doTask(request) // Non-blocking. No need to wait for result.
return response
}
func getResponse(request http.Request) http.Response {
// Do some
更新:异步只需执行它被告知的操作,您就可以很好地处理这些异常--请参阅我标记为问题解决方案的后续答案。下面是最初的问题,并以稍加修改的例子来澄清这个问题及其解决方案。
我一直在尝试调试一个在很大程度上依赖于异步的库。在编写一些示例代码时,我意识到有时执行键盘中断(CTRL)(很少!)引发了可怕的..。
Task exception was never retrieved
我一直在努力确保我派生的所有任务都能优雅地处理asyncio.CancelledError,在花了太多时间调试它之后,我意识到只有当异步任务之一被阻塞操作卡住时,我才会收到这条错误消息。
封锁?您真的不应该在任务中执行阻塞工作
警告:
WARNING: Executing Task pending name='Task-2673' coro=BaseSubprocessTransport._connect_pipes() running at /sarc/cad/tools/conda/envs/p3_impl7/lib/python3.8/asyncio/base_subprocess.py:168 wait_for=Future pending cb=[TaskWakeupMethWrapper object at 0x2b13f6c66e20()] created at /sarc/cad/to
我尝试为命令行编写某种渲染器,它应该能够使用asyncio和blessed打印来自stdin和其他数据源的数据,这是python-blessings的改进版本。
这是我到目前为止所知道的:
import asyncio
from blessed import Terminal
@asyncio.coroutine
def render(term):
while True:
received = yield
if received:
print(term.bold + received + term.normal)
async
我正在使用python中的websocket库与前端的JS代码进行通信。这是我正在做的事情的摘要。当我收到来自客户端的消息时,我调用__process_msg,生成一些输出,然后将结果发送回客户端。这里的问题是__process_msg很耗时。当我们在__process_msg中时,我不能为来自客户端的任何其他请求提供服务。如何使__process_msg成为非阻塞的? def __start_webtool_server(self, server, ephemeral_port):
log.info("Starting the Webtool server thread
我来自C#背景,Python的Asyncio库让我很困惑。
我读过下面的 ,但我仍然不清楚异步的使用情况。
我试图在python中制作一个网站刮刀,这是异步的。
async def requestPage(url):
request = requests.get(url, headers=headers)
soup = BeautifulSoup(request.content, 'html.parser')
return soup
async def main():
#****** How do I run an async task a
我试图为Python中长期运行的任务生成轮询机制。要做到这一点,我使用一个并发的未来,并与.done()民意测验。该任务存在许多本身是阻塞的迭代,我将其包装在一个异步函数中。我无法访问阻塞函数的代码,因为我正在调用第三方软件。这是我当前方法的一个很小的例子:
import asyncio
import time
async def blocking_iteration():
time.sleep(1)
async def long_running():
for i in range(5):
print(f"sleeping {i}")
我对python编程是个新手,我已经写了大约半年了。我已经决定尝试构建一个功能强大的交易机器人。在尝试编写这个机器人时,我偶然发现了asyncio模块。我真的很想更好地理解这个模块,但很难找到任何关于asyncio的简单教程或文档。
对于我的脚本,我收集了每枚硬币的卷。这非常有效,但收集所有卷需要很长时间。我想问一下我的脚本是否同步运行,如果是,我该如何修复?我正在使用API包装器与Binance Exchange通信。
import binance
import asyncio
import time
s = time.time()
names = [name for name in bi
当我运行以下代码时,它会运行并打印(“侦听,将您的应用程序连接到"),并作为web服务器等待请求。在web服务器模式下,我希望LED闪烁,这也是我应用asyncio的原因。
但是,除非它接收到任何请求(在web服务器中激活While True:循环),否则它不会响应。我已经尝试了很多方法,但我无法找到一种方式切换LED在web服务器模式。您可以在下面的代码中看到关于await asyncio.sleep(20)的注释:
import uasyncio as asyncio
from machine import Pin
import time
LED_PIN = 13
led = P
我正在通过os.system()执行一个外壳命令。我计划运行它1秒,如果超过时间就终止它。以下是我作为测试尝试的内容。 import os, time, asyncio
async def cmd():
os.system("my.py > my.txt") # this processes longer than 1 second
@asyncio.coroutine
def run():
try:
yield from asyncio.wait_for(cmd(), 1) # this should excute for more
根据我对asyncio的了解,它只应该打印0到4,但它要经过10位数。
难道stop_loop协同器不应该停止等待事件,并在我点击5之后取消循环吗?
import asyncio
async def run():
for i in range(10):
if i == 5:
e.set()
print(i)
async def stop_loop():
await e.wait()
l.stop()
e = asyncio.Event()
l = asyncio.get_event_loop()
l.set