pyuv+python35的超簡化異步編程方案,參考asyncio

jopen 8年前發布 | 8K 次閱讀 Python開發

pyuv的安裝請戳這里

實現原理類似參考

../_images/tulip_coro.png

測試代碼:

import pyuv
import sys
import functools

class Futear:

    _PENDING = 0
    _CANCELLED = 1
    _FINISHED = 2

    def __init__(self):
        self._result_args = []
        self._result_kwargs = {}
        self._state = Futear._PENDING
        self._coro = Task._current_task._coro if Task._current_task else None
        #todo: assert self._coro is not None

    def cancel(self):
        self._state = Futear._CANCELLED

    def set_result(self, *args):
        self._result_args = args
        self._state = Futear._FINISHED

        if self._coro is not None:
            try: 
                self._coro.send(None)
            except StopIteration as si:
                pass

    def result(self):
        if self._result_kwargs:
            return (*self._result_args, self._result_kwargs)
        else:
            return (*self._result_args, )

    def is_pending(self):
        return self._state == Futear._PENDING

    def is_done(self):
        return self._state == Futear._FINISHED

    def is_running(self):
        return self._state == Futear._PENDING

    def __iter__(self, *args):
        if self.is_running():
            yield self
        return self.result()  # May raise too.

    if sys.version_info >= (3, 5):
        __await__ = __iter__ # make compatible with 'await' expression

    pass

class Task(Futear):

    #_tasks = []
    _current_task = None

    def __init__(self, coro, timeout=None):
        super().__init__()
        Task.add_task(self)
        self._state = None
        #self._loop = loop
        if coro is not None:
            self._coro = coro

        self._start(timeout)

    def _start(self, timeout=None):
        if self._coro is not None:
            prev_task = Task._current_task
            Task._current_task = self
            try: 
                self._state = Futear._PENDING
                self._coro.send(None)
            except StopIteration as si:
                pass
            finally:
                Task._current_task = prev_task
            pass

    @classmethod
    def add_task(cls, task):
        #cls._tasks.append(task)
        pass        

loop = pyuv.Loop()

async def sleep(sec):
    timer = pyuv.Timer(loop)

    waiter = Futear()

    def callback(result, timer_handle):
        timer_handle.stop()
        waiter.set_result(result)

    cb = functools.partial(callback, "abc")
    timer.start(cb, sec, sec)
    return await waiter;

async def fork(x):
    print("sleeping...")
    res = await sleep(x)
    print("wakeup! Has got a result:%s" % res)

def main():
    t = Task(fork(1))
    print("after creating task.")

if __name__ == "__main__":
    main()

    loop.run()



后面的工作:

1,異常處理

2,運行時信息處理

3,使用統一方式封裝libuv。

來自: http://my.oschina.net/manfredlee/blog/603398

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!