国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PythonAsyncio中Coroutines,Tasks,Future可等候目標(biāo)關(guān)聯(lián)及功效

89542767 / 602人閱讀

  此篇文章關(guān)鍵闡述了PythonAsyncio中Coroutines,Tasks,Future可等候目標(biāo)關(guān)聯(lián)及功效,文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,必須的朋友可以學(xué)習(xí)一下


  前記


  上一篇閱讀理解《Python中Async語(yǔ)法協(xié)同程序的完成》闡述了Python是如何用制作器來(lái)達(dá)到協(xié)同程序的及其PythonAsyncio根據(jù)Future和Task的封裝形式來(lái)達(dá)到協(xié)同程序的生產(chǎn)調(diào)度,但在PythonAsyncio當(dāng)中Coroutines,Tasks和Future都是屬于可等候目標(biāo),使用的Asyncio的環(huán)節(jié)中,常常牽涉到三者的變換和生產(chǎn)調(diào)度,開發(fā)人員很容易在定義與作用上犯糊涂,文中關(guān)鍵論述是指三個(gè)相互關(guān)系和他們的功效。


  1.Asyncio的通道


  協(xié)同程序是進(jìn)程中常用的例外,協(xié)同程序的通道和轉(zhuǎn)換主要是靠事件循環(huán)來(lái)生產(chǎn)調(diào)度的,在新版Python中協(xié)同程序的通道是Asyncio.run,當(dāng)程序執(zhí)行到Asyncio.run后,能夠簡(jiǎn)單解讀為程序流程由進(jìn)程雙模式為協(xié)同程序方式(僅僅便捷了解,對(duì)電子計(jì)算機(jī)來(lái)說(shuō),并沒(méi)那樣區(qū)別),


  以下是一個(gè)最小的協(xié)程例子代碼:


  import asyncio
  async def main():
  await asyncio.sleep(0)
  asyncio.run(main())


  在這段代碼中,main函數(shù)和asyncio.sleep都屬于Coroutine,main是通過(guò)asyncio.run進(jìn)行調(diào)用的,接下來(lái)程序也進(jìn)入一個(gè)協(xié)程模式,asyncio.run的核心調(diào)用是Runner.run,它的代碼如下:


  class Runner:
  ...
  def run(self,coro,*,context=None):
  """Run a coroutine inside the embedded event loop."""
  #省略代碼
  ...
  #把coroutine轉(zhuǎn)為task
  task=self._loop.create_task(coro,context=context)
  #省略代碼
  ...
  try:
  #如果傳入的是Future或者coroutine,也會(huì)專為task
  return self._loop.run_until_complete(task)
  except exceptions.CancelledError:
  #省略代碼
  ...

  這一段編碼中刪除了一部分其他功能和復(fù)位的編碼,能夠看見這一段函數(shù)的基本功能是由loop.create_task方法將一個(gè)Coroutine目標(biāo)變?yōu)?個(gè)Task目標(biāo),再通過(guò)loop.run_until_complete等待這一Task運(yùn)作完畢。


  能夠看見,Asycnio并不能直接到生產(chǎn)調(diào)度Coroutine,反而是將它變?yōu)門ask然后再進(jìn)行生產(chǎn)調(diào)度,因?yàn)樵贏syncio中事件循環(huán)的最低生產(chǎn)調(diào)度目標(biāo)便是Task。但是在Asyncio中并非所有的Coroutine的啟用都要先被變?yōu)門ask目標(biāo)再等待,例如實(shí)例編碼中的asyncio.sleep,因?yàn)槭侵冈趍ain函數(shù)上直接awain的,因此它不被開展變換,而是通過(guò)等候,根據(jù)啟用專用工具剖析展現(xiàn)的圖如下所示:


  在這樣一個(gè)圖例中,從main函數(shù)到asyncio.sleep函數(shù)中無(wú)明顯的loop.create_task等把Coroutine變?yōu)門ask啟用,這兒往往無(wú)需開展轉(zhuǎn)化的緣故并不是做了很多獨(dú)特提升,反而是本因這般,這個(gè)awaitasyncio.sleep函數(shù)事實(shí)上依然會(huì)被main這一Coroutine轉(zhuǎn)化成的Task再次生產(chǎn)調(diào)度到。


  2.二種Coroutine調(diào)用方式的差別


  充分了解Task的生產(chǎn)調(diào)度基本原理以前,先回到起點(diǎn)的啟用實(shí)例,看一下直接使用Task啟用和直接使用Coroutine調(diào)用的差別是啥。


  如下所示編碼,大家表明的落實(shí)1個(gè)Coroutine變?yōu)門ask的實(shí)際操作再等待,那樣編碼就會(huì)變成下邊那樣:


  import asyncio
  async def main():
  await asyncio.create_task(asyncio.sleep(0))
  asyncio.run(main())


  這樣的代碼看起來(lái)跟最初的調(diào)用示例很像,沒(méi)啥區(qū)別,但是如果進(jìn)行一些改變,比如增加一些休眠時(shí)間和Coroutine的調(diào)用,就能看出Task對(duì)象的作用了,現(xiàn)在編寫兩份文件,


  他們的代碼如下:


  #demo_coro.py
  import asyncio
  import time
  async def main():
  await asyncio.sleep(1)
  await asyncio.sleep(2)
  s_t=time.time()
  asyncio.run(main())
  print(time.time()-s_t)
  #//Output:3.0028765201568604
  #demo_task.py
  import asyncio
  import time
  async def main():
  task_1=asyncio.create_task(asyncio.sleep(1))
  task_2=asyncio.create_task(asyncio.sleep(2))
  await task_1
  await task_2
  s_t=time.time()
  asyncio.run(main())
  print(time.time()-s_t)
  #//Output:2.0027475357055664


  在其中demo_coro.py展開了2次await啟用,程序流程的運(yùn)轉(zhuǎn)總時(shí)間為3秒,而demo_task.py乃是先將2個(gè)Coroutine目標(biāo)變?yōu)門ask目標(biāo),然后進(jìn)行2次await啟用,程序流程的運(yùn)轉(zhuǎn)總時(shí)間為2秒。不難發(fā)現(xiàn),demo_task.py的運(yùn)行中長(zhǎng)無(wú)限接近在其中運(yùn)作最長(zhǎng)的Task目標(biāo)時(shí)間,而demo_coro.py的運(yùn)行中長(zhǎng)乃是無(wú)限接近2個(gè)Coroutine對(duì)象總運(yùn)行中長(zhǎng)。


  為什么會(huì)是這樣的結(jié)局,是由于立即awaitCoroutine目標(biāo)時(shí),這段程序會(huì)一直等待,直至Coroutine目標(biāo)執(zhí)行完畢繼續(xù)往下沉,而Task目標(biāo)最大的不同便是在建立那一瞬間,就已將自己申請(qǐng)注冊(cè)到事件循環(huán)當(dāng)中等候被安排了運(yùn)作了,隨后回到一個(gè)task目標(biāo)供開發(fā)人員等候,因?yàn)閍syncio.sleep是1個(gè)純IO類別的啟用,因此在這一系統(tǒng)中,兩個(gè)asyncio.sleepCoroutine被變?yōu)門ask以此來(lái)實(shí)現(xiàn)了高并發(fā)啟用。


  3.Task與Future


  上述編碼往往根據(jù)Task能夠?qū)崿F(xiàn)高并發(fā)啟用,是由于Task中出現(xiàn)一些與事件循環(huán)互動(dòng)的函數(shù)公式,正是這種函數(shù)公式搭起了Coroutine高并發(fā)啟用的可能性,但是Task是Future的1個(gè)子對(duì)象,因此在掌握Task之前,必須先了解一下Future。


  3.1.Future


  與Coroutine僅有妥協(xié)和接受結(jié)論不一樣的是Future除去妥協(xié)和接受結(jié)論作用外,它也是1個(gè)只能處于被動(dòng)開展事情啟用且?guī)е鵂顟B(tài)下的器皿,他在復(fù)位的時(shí)候是Pending情況,這時(shí)候能夠被撤銷,被設(shè)置過(guò)程和結(jié)果設(shè)置出現(xiàn)異常。但在被設(shè)置相對(duì)應(yīng)的程序后,F(xiàn)uture會(huì)被轉(zhuǎn)換到了一個(gè)不可逆轉(zhuǎn)對(duì)應(yīng)狀態(tài),并且通過(guò)loop.call_sonn來(lái)啟用全部申請(qǐng)注冊(cè)到自身里的調(diào)用函數(shù),與此同時(shí)它帶著__iter__和__await__方式使之能夠被await和yieldfrom調(diào)用,它關(guān)鍵編碼如下所示:


  class Future:
  ...
  def set_result(self,result):
  """設(shè)置結(jié)果,并安排下一個(gè)調(diào)用"""
  if self._state!=_PENDING:
  raise exceptions.InvalidStateError(f'{self._state}:{self!r}')
  self._result=result
  self._state=_FINISHED
  self.__schedule_callbacks()
  def set_exception(self,exception):
  """設(shè)置異常,并安排下一個(gè)調(diào)用"""
  if self._state!=_PENDING:
  raise exceptions.InvalidStateError(f'{self._state}:{self!r}')
  if isinstance(exception,type):
  exception=exception()
  if type(exception)is StopIteration:
  raise TypeError("StopIteration interacts badly with generators"
  "and cannot be raised into a Future")
  self._exception=exception
  self._state=_FINISHED
  self.__schedule_callbacks()
  self.__log_traceback=True
  def __await__(self):
  """設(shè)置為blocking,并接受await或者yield from調(diào)用"""
  if not self.done():
  self._asyncio_future_blocking=True
  yield self#This tells Task to wait for completion.
  if not self.done():
  raise RuntimeError("await wasn't used with future")
  return self.result()#May raise too.
  __iter__=__await__#make compatible with'yield from'.

  單看這段代碼是很難理解為什么下面這個(gè)future被調(diào)用set_result后就能繼續(xù)往下走:


  async def demo(future:asyncio.Future):
  await future
  print("aha")

  這是因?yàn)镕uture跟Coroutine一樣,沒(méi)有主動(dòng)調(diào)度的能力,只能通過(guò)Task和事件循環(huán)聯(lián)手被調(diào)度。


  3.2.Task


  Task是Future的子類,除了繼承了Future的所有方法,它還多了兩個(gè)重要的方法__step和__wakeup,通過(guò)這兩個(gè)方法賦予了Task調(diào)度能力,這是Coroutine和Future沒(méi)有的,Task的涉及到調(diào)度的主要代碼如下(說(shuō)明見注釋):


  class Task(futures._PyFuture):#Inherit Python Task implementation#from a Python Future implementation.
  _log_destroy_pending=True
  def __init__(self,coro,*,loop=None,name=None,context=None):
  super().__init__(loop=loop)
  #省略部分初始化代碼
  ...
  #托管的coroutine
  self._coro=coro
  if context is None:
  self._context=contextvars.copy_context()
  else:
  self._context=context
  #通過(guò)loop.call_sonn,在Task初始化后馬上就通知事件循環(huán)在下次有空的時(shí)候執(zhí)行自己的__step函數(shù)
  self._loop.call_soon(self.__step,context=self._context)
  def __step(self,exc=None):
  coro=self._coro
  #方便asyncio自省
  _enter_task(self._loop,self)
  #Call either coro.throw(exc)or coro.send(None).
  try:
  if exc is None:
  #通過(guò)send預(yù)激托管的coroutine
  #這時(shí)候只會(huì)得到coroutine yield回來(lái)的數(shù)據(jù)或者收到一個(gè)StopIteration的異常
  #對(duì)于Future或者Task返回的是Self
  result=coro.send(None)
  else:
  #發(fā)送異常給coroutine
  result=coro.throw(exc)
  except StopIteration as exc:
  #StopIteration代表Coroutine運(yùn)行完畢
  if self._must_cancel:
  #coroutine在停止之前被執(zhí)行了取消操作,則需要顯示的執(zhí)行取消操作
  self._must_cancel=False
  super().cancel(msg=self._cancel_message)
  else:
  #把運(yùn)行完畢的值發(fā)送到結(jié)果值中
  super().set_result(exc.value)
  #省略其它異常封裝
  ...
  else:
  #如果沒(méi)有異常拋出
  blocking=getattr(result,'_asyncio_future_blocking',None)
  if blocking is not None:
  #通過(guò)Future代碼可以判斷,如果帶有_asyncio_future_blocking屬性,則代表當(dāng)前result是Future或者是Task
  #意味著這個(gè)Task里面裹著另外一個(gè)的Future或者Task
  #省略Future判斷
  ...
  if blocking:
  #代表這這個(gè)Future或者Task處于卡住的狀態(tài),
  #此時(shí)的Task放棄了自己對(duì)事件循環(huán)的控制權(quán),等待這個(gè)卡住的Future或者Task執(zhí)行完成時(shí)喚醒一下自己
  result._asyncio_future_blocking=False
  result.add_done_callback(self.__wakeup,context=self._context)
  self._fut_waiter=result
  if self._must_cancel:
  if self._fut_waiter.cancel(msg=self._cancel_message):
  self._must_cancel=False
  else:
  #不能被await兩次
  new_exc=RuntimeError(
  f'yield was used instead of yield from'
  f'in task{self!r}with{result!r}')
  self._loop.call_soon(
  self.__step,new_exc,context=self._context)
  elif result is None:
  #放棄了對(duì)事件循環(huán)的控制權(quán),代表自己托管的coroutine可能有個(gè)coroutine在運(yùn)行,接下來(lái)會(huì)把控制權(quán)交給他和事件循環(huán)
  #當(dāng)前的coroutine里面即使沒(méi)有Future或者Task,但是子Future可能有
  self._loop.call_soon(self.__step,context=self._context)
  finally:
  _leave_task(self._loop,self)
  self=None#Needed to break cycles when an exception occurs.
  def __wakeup(self,future):
  #其它Task和Future完成后會(huì)調(diào)用到該函數(shù),接下來(lái)進(jìn)行一些處理
  try:
  #回收Future的狀態(tài),如果Future發(fā)生了異常,則把異常傳回給自己
  future.result()
  except BaseException as exc:
  #This may also be a cancellation.
  self.__step(exc)
  else:
  #Task并不需要自己托管的Future的結(jié)果值,而且如下注釋,這樣能使調(diào)度變得更快
  #Don't pass the value of`future.result()`explicitly,
  #as`Future.__iter__`and`Future.__await__`don't need it.
  #If we call`_step(value,None)`instead of`_step()`,
  #Python eval loop would use`.send(value)`method call,
  #instead of`__next__()`,which is slower for futures
  #that return non-generator iterators from their`__iter__`.
  self.__step()
  self=None#Needed to break cycles when an exception occurs.


  這一份源代碼的Task目標(biāo)里的__setp方法非常長(zhǎng),根據(jù)精減之后可以發(fā)現(xiàn)她關(guān)鍵做的事情有三大:


  1.根據(jù)send或是throw來(lái)推動(dòng)Coroutine進(jìn)行相關(guān)


  2.根據(jù)給被他們托管Future或是Task加上調(diào)整來(lái)獲取完成通告并重新獲得管控權(quán)


  3.根據(jù)loop.call_soon來(lái)妥協(xié),把管控權(quán)交到事件循環(huán)


  單根據(jù)源碼分析往往很難搞清楚,以下屬于以二種Coroutine的編碼為例,簡(jiǎn)單論述Task與事件循環(huán)生產(chǎn)調(diào)度的一個(gè)過(guò)程,最先是demo_coro,這個(gè)案例中僅有一個(gè)Task:


  #demo_coro.py
  import asyncio
  import time
  async def main():
  await asyncio.sleep(1)
  await asyncio.sleep(2)
  s_t=time.time()
  asyncio.run(main())
  print(time.time()-s_t)
  #//Output:3.0028765201568604


  這個(gè)案例中首先是把main變?yōu)?個(gè)Task,隨后啟用到相對(duì)應(yīng)的__step方法,此刻__step方水陸法會(huì)會(huì)調(diào)用main()這一Coroutine的send(None)方式。


  以后全部流程的邏輯性就會(huì)直接轉(zhuǎn)至main函數(shù)中的awaitasyncio.sleep(1)這一Coroutine中,awaitasyncio.sleep(1)會(huì)教授成Future目標(biāo),并且通過(guò)loop.call_at告知事件循環(huán)在1秒之后激話這一Future目標(biāo),并把目標(biāo)回到。此刻邏輯性會(huì)再次回到Task的__step方方法中,__step發(fā)覺(jué)send調(diào)用換來(lái)的是1個(gè)Future目標(biāo),因此就在Future加上1個(gè)調(diào)整,讓Future完成情況下來(lái)激話自身,隨后選擇放棄對(duì)事件循環(huán)的管控權(quán)。接著就是事件循環(huán)在瞬間后激發(fā)了這一Future目標(biāo),這時(shí)候程序結(jié)構(gòu)便會(huì)實(shí)行到Future的調(diào)整,其實(shí)就是Task的__wakeup方法,因此Task的__step也被啟用到,而此次遇上了后邊的awaitasyncio.sleep(2),因此走了一次上邊的操作流程。當(dāng)兩個(gè)asyncio.sleep都實(shí)行結(jié)束后,Task的__step方法里對(duì)其Coroutine推送一個(gè)send(None)以后就捕捉到StopIteration出現(xiàn)異常,此刻Task便會(huì)根據(jù)set_result設(shè)定結(jié)論,并告別自己的生產(chǎn)調(diào)度步驟。


  能夠看見demo_core.py中僅有一個(gè)Task在承擔(dān)和事件循環(huán)一塊兒生產(chǎn)調(diào)度,事件循環(huán)的開端一定是個(gè)Task,并且通過(guò)Task來(lái)調(diào)節(jié)取一個(gè)Coroutine,根據(jù)__step方法把后續(xù)Future,Task,Coroutine都當(dāng)成1條鏈來(lái)運(yùn)作,而demo_task.py則不太一樣,生活中有兩個(gè)Task,編碼如下所示:


  #demo_task.py
  import asyncio
  import time
  async def main():
  task_1=asyncio.create_task(asyncio.sleep(1))
  task_2=asyncio.create_task(asyncio.sleep(2))
  await task_1
  await task_2
  s_t=time.time()
  asyncio.run(main())
  print(time.time()-s_t)
  #//Output:2.0027475357055664


  這個(gè)案例中最先還是和demo_coro相同,但跳轉(zhuǎn)main函數(shù)之后就開始有差別了,最先在這里函數(shù)中建立了task1和task2兩個(gè)Task,她們各自都是會(huì)根據(jù)__step方方法中的send激話相匹配的asyncio.sleepCoroutine,隨后等候相對(duì)應(yīng)的Future來(lái)通告自身已經(jīng)完成。但對(duì)于建立了那兩個(gè)Task的mainTask而言,根據(jù)main函數(shù)的awatitask_1和awaittask_2來(lái)掌握到他的“管控權(quán)“。關(guān)鍵在于根據(jù)awaittask_1句子,mainTask里的__step方法里在調(diào)用send后所得到的是task_1相對(duì)應(yīng)的Future,這時(shí)候能夠?yàn)檫@一Future加上1個(gè)調(diào)整,使他結(jié)束時(shí)通告自身,再走出一歩,針對(duì)task_2亦是如此。一直到最后兩個(gè)task都實(shí)行進(jìn)行,mainTask也捕捉到StopIteration出現(xiàn)異常,根據(jù)set_result設(shè)定結(jié)論,并告別自己的生產(chǎn)調(diào)度步驟。


  能夠看見demo_task.py與demo_coro.py有個(gè)很明顯的區(qū)別就是mainTask在運(yùn)轉(zhuǎn)的生命期中創(chuàng)立了兩個(gè)Task,并且通過(guò)await代管了兩個(gè)Task,與此同時(shí)兩個(gè)Task又能夠?qū)崿F(xiàn)2個(gè)協(xié)同程序的高并發(fā),因此不難發(fā)現(xiàn)事件循環(huán)運(yùn)作期內(nèi),現(xiàn)階段協(xié)同程序的并發(fā)數(shù)始終低于事件循環(huán)中登記注冊(cè)的Task總數(shù)。除此之外,假如在mainTask中要是沒(méi)有顯式地進(jìn)行await,那樣子Task便會(huì)肇事逃逸,不會(huì)受到mainTask管理方法,如下所示:


  #demo_task.py
  import asyncio
  import time
  def mutli_task():
  task_1=asyncio.create_task(asyncio.sleep(1))
  task_2=asyncio.create_task(asyncio.sleep(2))
  async def main():
  mutli_task()
  await asyncio.sleep(1.5)
  s_t=time.time()
  asyncio.run(main())
  print(time.time()-s_t)
  #//Output:1.5027475357055664


  4.匯總


  在進(jìn)一步了Task,F(xiàn)uture的源代碼了解之后,了解到了Task和Future在Asyncio的功效,并且也發(fā)覺(jué)Task和Future都和loop具有一定的藕合,而loop還可以通過(guò)相應(yīng)的方法去建立Task和Future,因此如果想真正意義上的理解到Asyncio的生產(chǎn)調(diào)度基本原理,還要更進(jìn)到一歩,根據(jù)Asyncio的源代碼去了解全部Asyncio的設(shè)計(jì)方案。


  綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/129056.html

相關(guān)文章

  • PythonAsyncio生產(chǎn)調(diào)度基本原理詳細(xì)信息

      此篇文章關(guān)鍵闡述了PythonAsyncio生產(chǎn)調(diào)度基本原理詳細(xì)信息,Python.Asyncio是1個(gè)專而精的庫(kù),它包括一些功效,而跟關(guān)鍵生產(chǎn)調(diào)度有關(guān)的思路除開三類可在等待目標(biāo)外,還有其他某些功效,他們各自坐落于runners.py,base_event.py,event.py3個(gè)文檔中  序言  在本文《PythonAsyncio中Coroutines,Tasks,Future可在等待對(duì)象...

    89542767 評(píng)論0 收藏0
  • 通讀Python官方文檔之協(xié)程、Future與Task

    摘要:所以在第一遍閱讀官方文檔的時(shí)候,感覺(jué)完全是在夢(mèng)游。通過(guò)或者等待另一個(gè)協(xié)程的結(jié)果或者異常,異常會(huì)被傳播。接口返回的結(jié)果指示已結(jié)束,并賦值。取消與取消不同。調(diào)用將會(huì)向被包裝的協(xié)程拋出。任務(wù)相關(guān)函數(shù)安排協(xié)程的執(zhí)行。負(fù)責(zé)切換線程保存恢復(fù)。 Tasks and coroutines 翻譯的python官方文檔 這個(gè)問(wèn)題的惡心之處在于,如果你要理解coroutine,你應(yīng)該理解future和tas...

    mgckid 評(píng)論0 收藏0
  • Python “黑魔法” 之 Generator Coroutines

    摘要:主程序通過(guò)喚起子程序并傳入數(shù)據(jù),子程序處理完后,用將自己掛起,并返回主程序,如此交替進(jìn)行。通過(guò)輪詢或是等事件框架,捕獲返回的事件。從消息隊(duì)列中取出記錄,恢復(fù)協(xié)程函數(shù)。然而事實(shí)上只有直接操縱的協(xié)程函數(shù)才有可能接觸到這個(gè)對(duì)象。 首發(fā)于 我的博客 轉(zhuǎn)載請(qǐng)注明出處 寫在前面 本文默認(rèn)讀者對(duì) Python 生成器 有一定的了解,不了解者請(qǐng)移步至生成器 - 廖雪峰的官方網(wǎng)站。 本文基于 Pyth...

    李文鵬 評(píng)論0 收藏0
  • Java多線程(2):使用線程池 ThreadPoolExecutor

    摘要:本文只介紹中線程池的基本使用,不會(huì)過(guò)多的涉及到線程池的原理。可緩存線程的線程池創(chuàng)建一個(gè)可緩存線程的線程池。首先是從接口繼承到的方法使用該方法即將一個(gè)任務(wù)交給線程池去執(zhí)行。方法方法的作用是向線程池發(fā)送關(guān)閉的指令。 首先,我們?yōu)槭裁葱枰€程池?讓我們先來(lái)了解下什么是 對(duì)象池 技術(shù)。某些對(duì)象(比如線程,數(shù)據(jù)庫(kù)連接等),它們創(chuàng)建的代價(jià)是非常大的 —— 相比于一般對(duì)象,它們創(chuàng)建消耗的時(shí)間和內(nèi)存都...

    darry 評(píng)論0 收藏0
  • PyTips 0x13 - Python 線程與協(xié)程(2)

    摘要:項(xiàng)目地址我之前翻譯了協(xié)程原理這篇文章之后嘗試用了模式下的協(xié)程進(jìn)行異步開發(fā),確實(shí)感受到協(xié)程所帶來(lái)的好處至少是語(yǔ)法上的。 項(xiàng)目地址:https://git.io/pytips 我之前翻譯了Python 3.5 協(xié)程原理這篇文章之后嘗試用了 Tornado + Motor 模式下的協(xié)程進(jìn)行異步開發(fā),確實(shí)感受到協(xié)程所帶來(lái)的好處(至少是語(yǔ)法上的:D)。至于協(xié)程的 async/await 語(yǔ)法是如...

    史占廣 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<