当前位置:脚本大全 > > 正文

python类中的数据封装(基于python生成器封装的协程类)

时间:2021-11-03 15:13:20类别:脚本大全

python类中的数据封装

基于python生成器封装的协程类

自从python2.2提供了yield关键字之后,python的生成器的很大一部分用途就是可以用来构建协同程序,能够将函数挂起返回中间值并能从上次离开的地方继续执行。python2.5的时候,这种生成器更加接近完全的协程,因为提供了将值和异常传递回到一个继续执行的函数中,当等待生成器的时候,生成器能返回控制。

python提供的生成器设施:

python封装

虽然python3提供了asyncio这样的异步IO库,而且也有greenlet等其他协程库,但目前的需求并不是实际的网络IO并发操作,而是需要模拟状态机的运行,因此使用协程可以很方便的模拟,并加入认为的控制,下面是封装的一个python类。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 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)
  • 基于上述封装,下面实现了一个协同的生产者消费者示例:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 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)
  • 运行结果如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 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
  • 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。

    原文链接:https://blog.csdn.net/u010487568/article/details/62042709

    上一篇下一篇

    猜您喜欢

    热门推荐