如何使python成为可等待对象

如何使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

在Python3.5.1中,可以使用wait/async,但是,要使用它(正如我所理解的),需要有waitable对象。 等待对象是一个定义返回迭代器的
\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`