Python异步IO.sleep

Python异步IO.sleep,python,python-asyncio,Python,Python Asyncio,是否可以在等待asyncio.sleep时更新对象的状态(即成员变量的值) 例如,假设服务器发送每秒递增的计数,客户端读取当前计数并将其存储在成员变量中。如果每个mod 100 it asyncio.sleep持续10秒,计数器成员变量的值是否可以在睡眠前后更改?比如说,100岁睡觉,110岁恢复,还是100岁 代码示例: server.py 导入异步IO 异步def发送_计数器(读写器): cnt=0 尽管如此: 打印(f“发送:{cnt!r}”) #将计数器编码为小端并发送 writer.w

是否可以在等待asyncio.sleep时更新对象的状态(即成员变量的值)

例如,假设服务器发送每秒递增的计数,客户端读取当前计数并将其存储在成员变量中。如果每个mod 100 it asyncio.sleep持续10秒,计数器成员变量的值是否可以在睡眠前后更改?比如说,100岁睡觉,110岁恢复,还是100岁

代码示例:

server.py

导入异步IO
异步def发送_计数器(读写器):
cnt=0
尽管如此:
打印(f“发送:{cnt!r}”)
#将计数器编码为小端并发送
writer.write((cnt).to_字节(4,“little”))
等待writer.drain()
cnt+=1
#调整发送速度
等待asyncio.sleep(1)
异步def main():
服务器=等待异步IO.启动服务器(发送计数器,“127.0.0.1”,5555)
与服务器异步:
等待服务器。永远为您服务()
asyncio.run(main())
client.py

导入异步IO
类别MyClass:
定义初始化(自):
自我评价.\u cnt=0
@财产
def计数(自身):
返回自我
@塞特伯爵
def计数(自身,x):
自。_cnt=x
异步def做某事然后睡眠(自我):
前=自
#在这里做点什么
打印(f“睡眠10秒-计数={self.\u cnt}”)
等待异步睡眠(10)
#理想情况下,self.\u cnt将反映服务器发送的最新计数
如果在之前!=自我介绍:
打印(f“在不同的{before}之前和之后!={self.\u cnt}”)
异步定义tcp_echo_客户端():
读卡器,等待异步。打开连接(“127.0.0.1”,5555)
o=MyClass()
尽管如此:
数据=等待读卡器读取(4)
o、 count=int(int.from_字节(数据,“little”))
打印(f“已接收:{o.count!r}”)
如果(o.计数%10)=9:
等待o.做点什么然后睡觉
asyncio.run(tcp\u echo\u client())
在上面的例子中,我认为问题在于,当等待
o.do\u something\u然后\u sleep
时,我停止读取套接字,这是有意义的。理想情况下,我会在睡眠期间继续读取套接字,从而在不同的消息出现之前和之后显示

这可以在单个线程上完成吗?避免引入线程、在执行器中运行、新的事件循环和锁?也许asyncio中有一种机制可以用来自动读取套接字并触发数据回调,从而避免显式读取?

是!AP(异步编程)本质上是“单线程并发”。这意味着,当一个协同程序处于睡眠状态时,其他协同程序可以运行

但是请注意,与多线程不同,如果您不睡眠(call
await
),则没有其他协同程序可以在两个语句之间运行,因此在我下面的示例中,变量不能在两个print语句之间进行外部更改

导入异步IO
随机输入
计数器=0
异步定义每十分之一秒()
全局计数器
尽管如此:
计数器+=1
等待asyncio.sleep(.2*random.random())
async def every_second():
全局计数器
尽管如此:
打印('计数器was',计数器)
计数器+=1
打印('现在是计数器',计数器)
等待asyncio.sleep(1)
async def async_main():
等待异步IO([
asyncio.create_task(每十分之一秒()),
asyncio.create_任务(每_秒()),
])
运行(async\u main())
这本书是:

counter was 1
counter is now 2
counter was 11
counter is now 12
counter was 20
counter is now 21
counter was 34
counter is now 35
counter was 44
counter is now 45
counter was 56
counter is now 57
counter was 69
counter is now 70
counter was 82
counter is now 83

我建议进一步解释!(:

您必须给出具体的代码示例。在异步代码中,变量可以而且正在变化。但是您必须注意变量的范围。@TinNguyen-很抱歉我不在计算机旁。请看我添加的代码示例。看起来您正在打印增量两边的计数器值。我在说关于在睡眠的任一侧打印值(参见我的代码示例)@AndyJohnson它也在睡眠的任一侧打印它,因为它在一个循环中。你可以看到它在睡眠期间从2上升到11。这是真的。说得好!