使用 asyncio 实现非阻塞 I/O

2024-01-06

我正在尝试使用 Pygame 和 asyncio 编写一个网络游戏,但我不知道如何避免挂起读取。这是我为客户提供的代码:

@asyncio.coroutine
def handle_client():
    print("Connected!")
    reader, writer = yield from asyncio.open_connection('localhost', 8000)
    while True:
        mouse_up = False
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()                
            elif event.type == pygame.MOUSEBUTTONUP:
                mouse_up = True

        if mouse_up:
            print("Writing")
            writer.write(b"Mouse up")
        print("Waiting to read")
        line = yield from reader.read(2**12)
        print(line.decode())

    writer.close()

这个挂在网上line = yield from reader.read(2**12)。我之前认为 asyncio 的要点在于它是非阻塞的,因此如果没有任何数据要读取,它就会继续执行。我现在发现事实并非如此。

如何将 asyncio 网络代码与 Pygame 绘图和事件代码集成?


要点是yield from是将执行切换到 asyncio 的事件循环and阻止当前协程直到结果可用。要在不阻塞当前协程的情况下安排任务,您可以使用asyncio.async().

要在不阻塞 pygame 循环的情况下打印到目前为止读取的数据:

@asyncio.coroutine
def read(reader, callback):
    while True:
        data = yield from reader.read(2**12)
        if not data: # EOF
            break
        callback(data)

@asyncio.coroutine
def echo_client():
    reader, ...
    chunks = []
    asyncio.async(read(reader, chunks.append))
    while True:
        pygame.event.pump() # advance pygame event loop
        ...
        if chunks: # print read-so-far data
            print(b''.join(chunks).decode())
            del chunks[:]
        yield from asyncio.sleep(0.016) # advance asyncio loop

内部不应该有阻塞调用while loop.

read() and sleep()协程在同一个线程中同时运行(显然您也可以同时运行其他协程)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 asyncio 实现非阻塞 I/O 的相关文章

  • 一次将Python dict的内容分配给多个变量?

    我想做这样的事情 def f return a 1 b 2 c 3 a b f or a b f IE 这样 a 被分配为 1 b 被分配为 2 并且 c 是未定义的 这与此类似 def f return 1 2 a b f 依赖于变量名称
  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • python - 是否可以扩展 xml-rpc 可以序列化的事物集?

    我看到几个问题询问如何发送numpy ndarray通过 xml rpc 调用 这不能开箱即用 因为正如 xml rpc 中所述docs https docs python org 2 library xmlrpclib html 有一组固
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • Python igraph:从图中删除顶点

    我正在使用安然电子邮件数据集 并尝试删除没有 enron com 的电子邮件地址 即我只想拥有安然电子邮件 当我尝试删除那些没有 enron com 的地址时 一些电子邮件由于某些原因被跳过 下面显示了一个小图 其中顶点是电子邮件地址 这是
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • Python:计算数据帧列中所有行中特定字符的实例数

    我有一个包含列 toaddress ccaddress body 的数据框 df 我想迭代数据帧的索引 以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小 最大和平均数量 这是通过计算这两列中每个字段中的 和 的实
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • conda-env list / conda info --envs 如何查找环境?

    我一直在尝试 anaconda miniconda 因为我的用户使用随 miniconda 安装的结构生物学程序 并且作者都没有 A 考虑到可能存在其他 miniconda 应用程序 B 他们的程序将在多用户环境中使用 因此 使用 Arch
  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o
  • Matplotlib Scatter - ValueError:RGBA 序列的长度应为 3 或 4

    我正在尝试为我的功能绘制图表 但不断收到此错误 ValueError RGBA sequence should have length 3 or 4 每当我只有 6 种形状时 代码就可以完美运行 但现在我将其增加到 10 种 它就不起作用了
  • Pandas Dataframe:将包含列表的行扩展到多行,并为所有列提供所需的索引

    我在 pandas 数据框中有时间序列数据 索引为测量开始时的时间 列中包含以固定采样率记录的值列表 连续索引 列表中元素数量的差异 这是它的样子 Time A B Z 0 1 2 3 4 1 2 3 4 2 5 6 7 8 5 6 7 8
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • TypeError:无法使用抽象方法实例化抽象类 <...>

    这是我的代码 from abc import ABC from abc import abstractmethod class Mamifiero ABC docstring for Mamifiero def init self self
  • 如何将列表字典写入字符串而不是 CSV 文件?

    This 堆栈溢出问题 https stackoverflow com questions 37997085 how to write a dictionary of lists to a csv file将列表字典写入 CSV 文件的答案
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide
  • 来自 django 教程 was_published_recently.admin_order_field = 'pub_date'

    From Django 教程 https www jetbrains com help pycharm 2017 1 creating and running your first django project html d28041e21

随机推荐

  • 如何找出计划任务的下一次运行时间?

    在 ColdFusion 9 中 是否有一种快速方法可以找出计划任务下次尝试运行的时间 我宁愿调用较低级别的 API 等来让 CF 计算它 以与通常相同的方式 我已经放弃了各种服务 并没有看到任何明显的方法可以调用 这会有所帮助 AFAIK
  • 重写Subject.next方法

    我有以下代码 我想在其中覆盖next有一些自定义逻辑 这种方式行不通 但只有在以下情况下才有效next是一个带有箭头函数的属性 其背后的原因是什么 export class Store
  • 合并具有相似名称的列

    我有一个带有非常烦人的变量名的数据框 基本上我对同一变量的观察分布在变量 g1 param1 g2 param1 g3 param1 等中 我想将它们全部加入到 1 个名为 param1 的变量 列中 g1 param1 g2 param1
  • 谷歌地点 API 是免费的吗? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我想用谷歌地点 API在网络应用程序中 我只是想确认API是否免费 如果是付费功能那么收费是多少 您可以查看每个API的定价here
  • C# 应用程序在远程上总是冻结

    我正在开发一个 C 应用程序 Net 3 5 Win Forms 该应用程序在服务器上运行 并由用户使用远程桌面访问 应用程序在远程计算机上看似随机的情况下一直冻结 即所有 GUI 组件都变成白色 任务管理器报告应用程序没有响应 但在本地运
  • 如何通过邮递员发送graphql查询?

    I use POST type URL http graphql Body query query noteTypes name label labelColor groupName groupLabel imageUrl 但它返回 mes
  • SAPUI5 表达式绑定

    是否可以将控件属性绑定到具有动态属性名称的模型 例如存储在另一个模型字段中 我以为我们可以使用 SAPUI5表达式绑定 https sapui5 hana ondemand com docs guide daf6852a04b44d1189
  • 在 Android 中的 BOOT_COMPLETE 上,未从 AndroidManifest 调用 BroadcastReceiver

    在我的 Android 应用程序中 我想运行Service无需打开 运行我的应用程序 为此我延长了BroadcastReciever班级 但是这个BroadcastReceiver类未被调用AndroidManifest xml on BO
  • 使用 jquery 拖放

    我有两个基于 jquery 的列表 示例是here http devheart org examples jquery customizable layout using drag and drop 2 saving and loading
  • 在 C# 桌面应用程序中存储我的 Amazon 凭证

    我正在考虑在桌面应用程序中使用 Amazon S3 和 simpleDB 我遇到的主要问题是我需要将我的 aws 凭证存储在应用程序中或使用其他方案 我猜想将它们存储在应用程序中是不可能的 因为它们很容易被挑选出来 另一种选择是创建一个 W
  • 如何在 Angular.js 中解析 Int

    也许 这是最简单的事情 但我无法将字符串解析为角度中的 Int 我正在尝试做的事情
  • MISRA C++ 2008 规则 5-2-7 违规:具有指针类型的对象不得直接或间接转换为不相关的指针类型

    在以下示例中 void bad function char t ptr 0 MISRA doesn t complains here it allows cast of char to void pointer void p2 ptr th
  • Magento 产品使用 SQL 查询从数据库导入

    Magento 在其数据库系统中使用 EAV 结构 我有这个查询 它为我提供了我的 magento 商店中的产品 ID 和产品名称 SELECT e entity id AS product id var value AS product
  • 如何以 SVG 形式获取 matplotlib 图的输出?

    我需要获取 matplotlib 图的输出并将其转换为可以在激光切割机上使用的 SVG 路径 import matplotlib pyplot as plt import numpy as np x np arange 0 100 0 00
  • Android 应用程序从 linkedin 访问令牌

    首先 是否可以使用 facebook twitter 等 Android 应用程序添加 linkedin 我读过很多博客 但无法在我的应用程序中实现 linkedin 我已达到应用程序的用户授权流程 用户输入其用户名和密码 但是当他输入 5
  • Firebase onCreate 触发器:无法获取除 UNAUTHENTICATED 之外的 authType

    使用具有以下规则的 Firebase 实时数据库 rules messages read auth null write auth null 并且 将此触发器定义为 exports localOnCreate functions datab
  • 扩展 Google 地图范围,使 div 叠加层不覆盖任何标记

    在我正在开发的 Google 地图混搭中 地图为 100 宽 高度几乎为 100 并且我有一个水平透明 div 它使用 z index 和 CSS 覆盖地图的左侧 当我动态添加标记时 我从一个空的 Bounds 对象开始 然后将其一一扩展以
  • 隐藏软键盘

    我需要能够隐藏软键盘以响应单击按钮 我看过很多关于这个主题的帖子 似乎解决方案是使用InputMethodManager 但我一直无法让它为我工作 据说以下将隐藏软键盘 InputMethodManager inputManager Inp
  • 如何设置 CSS、JS 和图像的过期时间?

    我最近使用 firebug 上的 pagespeed 插件分析了我的网站 它建议我设置 CSS JS 和图像文件的过期时间 我想知道 我该怎么做 当我运行 PageSpeed Addon 时 我用它来修复完全相同的问题
  • 使用 asyncio 实现非阻塞 I/O

    我正在尝试使用 Pygame 和 asyncio 编写一个网络游戏 但我不知道如何避免挂起读取 这是我为客户提供的代码 asyncio coroutine def handle client print Connected reader w