真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python中如何使用生成器封裝協(xié)程類-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關(guān)python中如何使用生成器封裝協(xié)程類,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司專注于保德網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供保德營銷型網(wǎng)站建設,保德網(wǎng)站制作、保德網(wǎng)頁設計、保德網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務,打造保德網(wǎng)絡公司原創(chuàng)品牌,更為您提供保德網(wǎng)站排名全網(wǎng)營銷落地服務。

自從python2.2提供了yield關(guān)鍵字之后,python的生成器的很大一部分用途就是可以用來構(gòu)建協(xié)同程序,能夠?qū)⒑瘮?shù)掛起返回中間值并能從上次離開的地方繼續(xù)執(zhí)行。python2.5的時候,這種生成器更加接近完全的協(xié)程,因為提供了將值和異常傳遞回到一個繼續(xù)執(zhí)行的函數(shù)中,當?shù)却善鞯臅r候,生成器能返回控制。

python提供的生成器設施:

  • yield:能夠?qū)⒆约簰炱?,并提供一個返回值給等待方

  • send:喚起一個被掛起的生成器,并能夠傳遞一個參數(shù),可以在生成器中拋出異常

  • next:本質(zhì)上相當于send(None),對每個生成器的第一次調(diào)用必須不能傳遞參數(shù)

  • close:主動退出一個生成器

python封裝

雖然python3提供了asyncio這樣的異步IO庫,而且也有g(shù)reenlet等其他協(xié)程庫,但目前的需求并不是實際的網(wǎng)絡IO并發(fā)操作,而是需要模擬狀態(tài)機的運行,因此使用協(xié)程可以很方便的模擬,并加入認為的控制,下面是封裝的一個python類。

class Coroutine(object):

  """ Base class of the general coroutine object """

  STATE_RUNNING = 0
  STATE_WAITING = 1
  STATE_CLOSING = 2

  def __init__(self):
    self.state = Coroutine.STATE_WAITING
    self.started = False
    self.args = None
    self.routine = self._co()

  def _co(self):
    self.ret = None
    while True:
      self.args = yield self.ret
      if not self.started:
        self.started = True
        continue
      else:
        self.state = Coroutine.STATE_RUNNING
        self.ret = self.run(self.args)
      if self.state == Coroutine.STATE_CLOSING:
        break
      self.state = Coroutine.STATE_WAITING

  def start(self):
    """ Start the generator """
    if self.routine is None:
      raise RuntimeError('NO task to start running!')
    self.started = True
    self.routine.next()

  def finish(self):
    """ Finish the execution of this routine """
    self.state = Coroutine.STATE_CLOSING
    self.routine.close()

  def run(self, args):
    """ The runing method to be executed every once time"""
    raise NotImplementedError

  def execute(self, arg_obj):
    """ Awake this routine to execute once time """
    return self.routine.send(arg_obj)

基于上述封裝,下面實現(xiàn)了一個協(xié)同的生產(chǎn)者消費者示例:

class ProducerCoroutine(Coroutine):

  """ The Producer concrete coroutine """

  def __init__(self, cnsmr):
    if not isinstance(cnsmr, Coroutine):
      raise RuntimeError('Consumer is not a Coroutine object')
    self.consumer = cnsmr
    self.consumer.start()
    super(ProducerCoroutine, self).__init__()

  def run(self, args):
    print 'produce ', args
    ret = self.consumer.execute(args)
    print 'consumer return:', ret

  def __call__(self, args):
    """ Custom method for the specific logic """
    self.start()
    while len(args) > 0:
      p = args.pop()
      self.execute(p)
    self.finish()


class ConsumerCoroutine(Coroutine):

  """ The Consumer concrete coroutine """

  def __init__(self):
    super(ConsumerCoroutine, self).__init__()

  def run(self, args):
    print 'consumer get args: ', args
    return 'hahaha' + repr(args)

運行結(jié)果如下:

produce 4
consumer get args: 4
consumer return: hahaha4
produce 3
consumer get args: 3
consumer return: hahaha3
produce 2
consumer get args: 2
consumer return: hahaha2
produce 1
consumer get args: 1
consumer return: hahaha1
produce 0
consumer get args: 0
consumer return: hahaha0

關(guān)于“python中如何使用生成器封裝協(xié)程類”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。


分享名稱:python中如何使用生成器封裝協(xié)程類-創(chuàng)新互聯(lián)
本文來源:http://weahome.cn/article/dsdjjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部