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()