在 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`
答案 0 :(得分:5)
我想仍然没有答案,因为问题不是很清楚。 你正确地说了
一个等待对象是一个定义返回迭代器
的__await__()
方法的对象
这里添加的内容不多。只需从该方法返回一个迭代器。
您唯一需要了解的是它是如何工作的。我的意思是,asyncio或其他类似的框架如何在单个线程中实现并发。这在高级别上很简单:只需将所有代码组织为迭代器,然后逐个调用它们直到值耗尽。
所以,例如,如果你有两个迭代器,让我们说第一个产生字母,第二个产生数字,事件循环调用第一个得到'A'
,然后它调用第二个并获取1
然后它再次调用第一个并获取'B'
等等,直到迭代器完成。当然,这些迭代器中的每一个都可以在产生下一个值之前做任何你想做的事情。但是,它需要的时间越长 - 切换任务之间的停顿时间越长'将会。你必须保持每次迭代的简短:
async for
- 这将允许在没有显式屈服的情况下切换任务。asyncio.sleep(0)
←这样的黑客,这是asyncio允许在此处切换任务。socket.recv()
之类的事情。在此呼叫结束之前,所有任务都将停止。这就是在标准库中调用async io
的原因:您必须使用所有I / O函数的实现,例如BaseEventLoop.sock_recv()
。我建议您使用以下文档开始(如果您还没有):