如何使python成为可等待对象
在Python3.5.1中,可以使用wait/async,但是,要使用它(正如我所理解的),需要有waitable对象。 等待对象是一个定义返回迭代器的如何使python成为可等待对象,python,websocket,async-await,pyserial,python-3.5,Python,Websocket,Async Await,Pyserial,Python 3.5,在Python3.5.1中,可以使用wait/async,但是,要使用它(正如我所理解的),需要有waitable对象。 等待对象是一个定义返回迭代器的\uuuuuuuuuuuuuu()方法的对象。更多信息。 但我不能谷歌出任何这样的例子,因为大多数例子都有某种asyncio.sleep(x)来模拟等待对象 我的最终目标是制作简单的websocket串行服务器,然而,我无法通过这第一步。 这是我的(非工作代码) 我想还是没有答案,因为问题不太清楚。 你说得对 等待对象是一个定义返回迭代器的\uu
\uuuuuuuuuuuuuu()方法的对象。更多信息。
但我不能谷歌出任何这样的例子,因为大多数例子都有某种asyncio.sleep(x)来模拟等待对象
我的最终目标是制作简单的websocket串行服务器,然而,我无法通过这第一步。
这是我的(非工作代码)
我想还是没有答案,因为问题不太清楚。
你说得对
等待对象是一个定义返回迭代器的\uuuuuuuuuuuuuuu()方法的对象
这里没什么可补充的。只需从该方法返回一个迭代器
你唯一需要了解的是它是如何工作的。我的意思是,asyncio或其他类似框架如何在单个线程中实现并发性。这在高层次上很简单:只需将所有代码组织为迭代器,然后逐个调用它们,直到值用尽为止
例如,如果您有两个迭代器,假设第一个迭代器生成字母,第二个迭代器生成数字,事件循环调用第一个迭代器并获取'A'
,然后调用第二个迭代器并获取1
,然后再次调用第一个迭代器并获取'B'
,依此类推,直到迭代器完成。当然,在生成下一个值之前,这些迭代器中的每一个都可以执行您想要的任何操作。但是,时间越长,“切换任务”之间的停顿时间就越长。您必须缩短每次迭代的时间:
如果您有内部循环,请对
使用异步-这将允许在不显式屈服的情况下切换任务
<>如果你有很多代码执行几十或甚至几百毫秒,考虑改写它的小块。对于遗留代码,您可以使用类似asyncio.sleep(0)
← 这是允许asyncio在此处切换任务
禁止阻塞操作!这是最重要的。假设你做了一些事情,比如“代码> Socket .ReVo())<代码>。在此调用结束之前,所有任务都将停止。这就是为什么在标准库中称之为async io
:您必须使用它们实现的所有I/O函数,如BaseEventLoop.sock\u recv()
我建议您(如果您还没有)从以下文档开始:
serial.serial()
不是可等待的对象。最终,您需要创建可等待的I/O原语,这些原语知道如何推迟执行,直到数据可用。这不是为胆小的人准备的。我认为还没有一个串行端口可以等待。@MartijnPieters我认为串行端口的原理与我们处理一些持久的数学算法是一样的。我不知道的是如何创建等待对象本身(如文档链接中所述)。因为,尽管序列号还没有等待,但它“可能”已经包装好了。我承认我对python不太了解,但我会尝试一下,我希望至少(创建可等待对象的)这第一步在这里得到更多的解释。因为,还没有人建议,您应该看看:。我不完全确定您想要实现什么,但是从文档中对waitiable抽象类进行子类化将允许您创建一个定制的“waitiable”对象。
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`