python await对象_如何使python等待对象

在python 3.5.1中,可以使用await / async,但是,要使用它(因为我不支持),你需要有一个等待对象.

一个等待对象是一个对象,它定义了返回迭代器的__await __()方法.更多信息here.

但我不能谷歌任何有这个的例子,因为大多数例子都有某种asyncio.sleep(x)来模仿等待对象.

我的最终目标是制作简单的websocket串口服务器,但是,我无法通过这第一步.

这是我的(非工作代码).

import serial

import asyncio

connected = False

port = 'COM9'

#port = '/dev/ttyAMA0'

baud = 57600

timeout=1

class startser(object):

def __init__(self, port, baud):

self.port = port

self.baud = baud

def openconn(self):

self.ser = serial.Serial(port, baud)

async def readport(self):

#gooo= await (self.ser.in_waiting > 0)

read_byte = async self.ser.read(1).decode('ascii')

self.handle_data(read_byte)

print ("42")

def handle_data(self, data):

print(data)

serr=startser(port,baud)

serr.openconn()

loop = asyncio.get_event_loop()

#loop.run_forever(serr.readport())

loop.run_until_complete(serr.readport())

loop.close()

print ("finitto")

#with serial.Serial('COM9', 115200, timeout=1) as ser:

#x = ser.read() # read one byte

#s = ser.read(10) # read up to ten bytes (timeout)

#line = ser.readline() # read a '\n' terminated line`

解决方法:

我想仍然没有答案,因为问题不是很清楚.

你正确地说了

An awaitable object is an object that defines __await__() method returning an iterator

在这里添加不多.只需从该方法返回一个迭代器.

您唯一需要了解的是它是如何工作的.我的意思是,asyncio或其他类似的框架如何在单个线程中实现并发.这在高级别上很简单:只需将所有代码组织为迭代器,然后逐个调用它们直到值耗尽.

所以,例如,如果你有两个迭代器,让我们说第一个产生字母,第二个产生数字,事件循环调用第一个得到’A’,然后它调用第二个得到1然后再调用第一个并获取’B’等等,直到迭代器完成.当然,这些迭代器中的每一个都可以在产生下一个值之前做任何你想做的事情.但是,花费的时间越长 – “切换任务”之间的停顿时间就越长.你必须保持每次迭代的简短:

>如果你有内部循环,请使用async – 这将允许切换任务而不显式屈服.

>如果你有很多代码可以执行几十甚至几百毫秒,可以考虑用较小的代码重写它.在遗留代码的情况下,您可以使用像asyncio.sleep(0)←这样的hacks,这是asyncio允许在这里切换任务.

>无阻塞操作!这是最重要的.考虑你做一些像socket.recv().在此呼叫结束之前,所有任务都将停止.这就是在标准库中将其称为async io的原因:您必须使用其所有I / O函数的实现,如BaseEventLoop.sock_recv().

我建议您使用以下文档开始(如果您还没有):

标签:python,websocket,async-await,python-3-5,pyserial

来源: https://codeday.me/bug/20190519/1135014.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值