NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

geventimpl.py (3616B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\uthread2_plugins\geventimpl.py
      2 import gevent
      3 import sys
      4 from gevent import monkey
      5 if 'shared_tools' not in sys.executable:
      6     monkey.patch_socket()
      7     monkey.patch_ssl()
      8 import gevent.event as gevents
      9 try:
     10     from gevent.lock import Semaphore
     11 except ImportError:
     12     from gevent.coros import Semaphore
     13 
     14 import weakref
     15 try:
     16     from gevent.queue import Channel as GChannel
     17 except ImportError:
     18     from gevent.queue import Queue as GChannel
     19 
     20 from gevent.queue import LifoQueue
     21 from . import BaseUthreadImpl, Tasklet, BaseSemaphore, BaseChannel, pop_stackless_tracing_enabled
     22 
     23 class GeventTasklet(Tasklet):
     24 
     25     def __init__(self, func, *args, **kwargs):
     26         pop_stackless_tracing_enabled(kwargs)
     27 
     28         def inner():
     29             gevent.getcurrent().uthread2_tasklet = weakref.ref(self)
     30             func(*args, **kwargs)
     31 
     32         self.tasklet = gevent.spawn(inner)
     33 
     34     def is_alive(self):
     35         return not self.tasklet.ready()
     36 
     37     def kill(self):
     38         self.tasklet.kill()
     39 
     40     def get(self):
     41         return self.tasklet.get()
     42 
     43 
     44 class GeventSemaphore(BaseSemaphore):
     45 
     46     def __init__(self):
     47         self.__semaphore = Semaphore()
     48 
     49     def __enter__(self):
     50         self.__semaphore.__enter__()
     51 
     52     def __exit__(self, exc, val, tb):
     53         self.__semaphore.__exit__(exc, val, tb)
     54 
     55     def acquire(self):
     56         self.__semaphore.acquire()
     57 
     58     def release(self):
     59         self.__semaphore.release()
     60 
     61 
     62 class _GeventAutoTasklet(GeventTasklet):
     63 
     64     def __init__(self, tasklet):
     65         self.tasklet = weakref.proxy(tasklet)
     66         self.tasklet.uthread2_tasklet = lambda : self
     67 
     68     def is_alive(self):
     69         return not self.tasklet.dead
     70 
     71 
     72 class _GeventUthread(BaseUthreadImpl):
     73 
     74     def sleep(self, seconds):
     75         gevent.sleep(seconds)
     76 
     77     def start_tasklet(self, func, *args, **kwargs):
     78         return GeventTasklet(func, *args, **kwargs)
     79 
     80     def yield_(self):
     81         gevent.sleep(0)
     82 
     83     def get_current(self):
     84         current = gevent.getcurrent()
     85         try:
     86             return current.uthread2_tasklet()
     87         except AttributeError:
     88             return _GeventAutoTasklet(current)
     89 
     90     def wait(self, tasklets, timeout):
     91         greenlets = [ x.tasklet for x in tasklets ]
     92         gevent.wait(greenlets, timeout)
     93 
     94     def Event(self):
     95         return gevents.Event()
     96 
     97     def Semaphore(self):
     98         return GeventSemaphore()
     99 
    100     def BlockingChannel(self):
    101         return BlockingChannel()
    102 
    103     def PumpChannel(self):
    104         return PumpChannel()
    105 
    106     def QueueChannel(self):
    107         return QueueChannel()
    108 
    109 
    110 class Channel(BaseChannel):
    111 
    112     def __init__(self):
    113         self.channel = GChannel()
    114 
    115     def _send(self, data, block = False, timeout = None):
    116         self.channel.put(data, block=block, timeout=timeout)
    117 
    118     def _receive(self, block = False, timeout = None):
    119         return self.channel.get(block=block, timeout=timeout)
    120 
    121 
    122 class BlockingChannel(Channel):
    123 
    124     def send(self, data):
    125         self._send(data, block=True)
    126 
    127     def receive(self):
    128         return self._receive()
    129 
    130 
    131 class PumpChannel(Channel):
    132 
    133     def send(self, data):
    134         self._send(data)
    135 
    136     def receive(self):
    137         return self._receive(block=True)
    138 
    139 
    140 class QueueChannel(object):
    141 
    142     def __init__(self):
    143         self.queue = LifoQueue()
    144 
    145     def send(self, item):
    146         self.queue.put(item=item, block=False)
    147 
    148     def receive(self):
    149         return self.queue.get(block=True)
    150 
    151     def __len__(self):
    152         return self.queue.qsize()
    153 
    154     def __next__(self):
    155         return self.receive()
    156 
    157 
    158 GeventImpl = _GeventUthread()