pyuv+python35的超簡化異步編程方案,參考asyncio
實現原理類似參考:
測試代碼:
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。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!