|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
# HG changeset patch
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
# User Johannes Erdfelt <johannes@erdfelt.com>
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
# Date 1330543338 0
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
# Node ID 2a02c700f51adfd406082bbef5f331745aa1219a
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
# Parent f2833c4d0bf8fb7f150bc6fc16d0b79cc329f1a7
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
Monkey patch threading.current_thread() as well
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
Fixes bug 115
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
Patching thread.get_ident() but not threading.current_thread() can
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
result in _DummyThread objects being created. These objects will
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
never be garbage collected and will leak memory. In a long running
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
process (like a daemon), this can result in a pretty significant
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
memory leak if it uses green threads regularly.
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
diff -r f2833c4d0bf8fb7f150bc6fc16d0b79cc329f1a7 -r 2a02c700f51adfd406082bbef5f331745aa1219a eventlet/green/threading.py
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
--- a/eventlet/green/threading.py Wed Feb 29 05:45:12 2012 +0000
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+++ b/eventlet/green/threading.py Wed Feb 29 19:22:18 2012 +0000
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
@@ -1,9 +1,16 @@
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+"""Implements the standard threading module, using greenthreads."""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
from eventlet import patcher
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
from eventlet.green import thread
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
from eventlet.green import time
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+from eventlet.support import greenlets as greenlet
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
__patched__ = ['_start_new_thread', '_allocate_lock', '_get_ident', '_sleep',
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- 'local', 'stack_size', 'Lock']
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ 'local', 'stack_size', 'Lock', 'currentThread',
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ 'current_thread']
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+__orig_threading = patcher.original('threading')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+__threadlocal = __orig_threading.local()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
patcher.inject('threading',
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
globals(),
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
@@ -11,3 +18,79 @@
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
('time', time))
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
del patcher
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+_count = 1
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+class _GreenThread(object):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ """Wrapper for GreenThread objects to provide Thread-like attributes
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ and methods"""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def __init__(self, g):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ global _count
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self._g = g
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self._name = 'GreenThread-%d' % _count
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ _count += 1
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def __repr__(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return '<_GreenThread(%s, %r)>' % (self._name, self._g)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ @property
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def name(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return self._name
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def getName(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return self.name
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ get_name = getName
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def join(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return self._g.wait()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+__threading = None
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def _fixup_thread(t):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # Some third-party packages (lockfile) will try to patch the
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # threading.Thread class with a get_name attribute if it doesn't
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # exist. Since we might return Thread objects from the original
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # threading package that won't get patched, let's make sure each
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # individual object gets patched too our patched threading.Thread
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # class has been patched. This is why monkey patching can be bad...
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ global __threading
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ if not __threading:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ __threading = __import__('threading')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ if (hasattr(__threading.Thread, 'get_name') and
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ not hasattr(t, 'get_name')):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ t.get_name = t.getName
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return t
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def current_thread():
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ g = greenlet.getcurrent()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ if not g:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # Not currently in a greenthread, fall back to standard function
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return _fixup_thread(__orig_threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ try:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ active = __threadlocal.active
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ except AttributeError:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ active = __threadlocal.active = {}
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ try:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ t = active[id(g)]
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ except KeyError:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # Add green thread to active if we can clean it up on exit
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def cleanup(g):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ del active[id(g)]
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ try:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ g.link(cleanup)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ except AttributeError:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # Not a GreenThread type, so there's no way to hook into
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # the green thread exiting. Fall back to the standard
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ # function then.
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ t = _fixup_thread(__orig_threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ else:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ t = active[id(g)] = _GreenThread(g)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ return t
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+currentThread = current_thread
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
diff -r f2833c4d0bf8fb7f150bc6fc16d0b79cc329f1a7 -r 2a02c700f51adfd406082bbef5f331745aa1219a eventlet/patcher.py
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
--- a/eventlet/patcher.py Wed Feb 29 05:45:12 2012 +0000
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+++ b/eventlet/patcher.py Wed Feb 29 19:22:18 2012 +0000
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
@@ -223,7 +223,6 @@
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
on.setdefault(modname, default_on)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
modules_to_patch = []
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- patched_thread = False
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
if on['os'] and not already_patched.get('os'):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
modules_to_patch += _green_os_modules()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
already_patched['os'] = True
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
@@ -234,7 +233,6 @@
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
modules_to_patch += _green_socket_modules()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
already_patched['socket'] = True
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
if on['thread'] and not already_patched.get('thread'):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- patched_thread = True
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
modules_to_patch += _green_thread_modules()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
already_patched['thread'] = True
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
if on['time'] and not already_patched.get('time'):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
@@ -266,27 +264,9 @@
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
patched_attr = getattr(mod, attr_name, None)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
if patched_attr is not None:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
setattr(orig_mod, attr_name, patched_attr)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
-
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- # hacks ahead; this is necessary to prevent a KeyError on program exit
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- if patched_thread:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- _patch_main_thread(sys.modules['threading'])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
finally:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
imp.release_lock()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
-def _patch_main_thread(mod):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- """This is some gnarly patching specific to the threading module;
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- threading will always be initialized prior to monkeypatching, and
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- its _active dict will have the wrong key (it uses the real thread
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- id but once it's patched it will use the greenlet ids); so what we
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- do is rekey the _active dict so that the main thread's entry uses
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- the greenthread key. Other threads' keys are ignored."""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- thread = original('thread')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- curthread = mod._active.pop(thread.get_ident(), None)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- if curthread:
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- import eventlet.green.thread
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
- mod._active[eventlet.green.thread.get_ident()] = curthread
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
-
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
-
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
def is_monkey_patched(module):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
"""Returns True if the given module is monkeypatched currently, False if
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
not. *module* can be either the module itself or its name.
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
diff -r f2833c4d0bf8fb7f150bc6fc16d0b79cc329f1a7 -r 2a02c700f51adfd406082bbef5f331745aa1219a tests/patcher_test.py
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
--- a/tests/patcher_test.py Wed Feb 29 05:45:12 2012 +0000
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+++ b/tests/patcher_test.py Wed Feb 29 19:22:18 2012 +0000
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
@@ -293,5 +293,95 @@
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
self.assertEqual(output, "done\n", output)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+class Threading(ProcessBase):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def test_orig_thread(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ new_mod = """import eventlet
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+eventlet.monkey_patch()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+from eventlet import patcher
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+import threading
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+_threading = patcher.original('threading')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def test():
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ print repr(threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t = _threading.Thread(target=test)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t.start()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t.join()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+print len(threading._active)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+print len(_threading._active)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+"""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.write_to_tempfile("newmod", new_mod)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ output, lines = self.launch_subprocess('newmod')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(len(lines), 4, "\n".join(lines))
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assert_(lines[0].startswith('
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(lines[1], "1", lines[1])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(lines[2], "1", lines[2])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def test_threading(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ new_mod = """import eventlet
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+eventlet.monkey_patch()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+import threading
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def test():
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ print repr(threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t = threading.Thread(target=test)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t.start()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t.join()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+print len(threading._active)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+"""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.write_to_tempfile("newmod", new_mod)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ output, lines = self.launch_subprocess('newmod')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(len(lines), 3, "\n".join(lines))
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assert_(lines[0].startswith('<_MainThread'), lines[0])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(lines[1], "1", lines[1])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def test_tpool(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ new_mod = """import eventlet
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+eventlet.monkey_patch()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+from eventlet import tpool
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+import threading
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def test():
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ print repr(threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+tpool.execute(test)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+print len(threading._active)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+"""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.write_to_tempfile("newmod", new_mod)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ output, lines = self.launch_subprocess('newmod')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(len(lines), 3, "\n".join(lines))
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assert_(lines[0].startswith('
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(lines[1], "1", lines[1])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def test_greenlet(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ new_mod = """import eventlet
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+eventlet.monkey_patch()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+from eventlet import event
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+import threading
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+evt = event.Event()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def test():
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ print repr(threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ evt.send()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+eventlet.spawn_n(test)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+evt.wait()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+print len(threading._active)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+"""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.write_to_tempfile("newmod", new_mod)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ output, lines = self.launch_subprocess('newmod')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(len(lines), 3, "\n".join(lines))
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assert_(lines[0].startswith('<_MainThread'), lines[0])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(lines[1], "1", lines[1])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ def test_greenthread(self):
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ new_mod = """import eventlet
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+eventlet.monkey_patch()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+import threading
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+def test():
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ print repr(threading.current_thread())
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t = eventlet.spawn(test)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+t.wait()
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+print len(threading._active)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+"""
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.write_to_tempfile("newmod", new_mod)
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ output, lines = self.launch_subprocess('newmod')
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(len(lines), 3, "\n".join(lines))
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assert_(lines[0].startswith('<_GreenThread'), lines[0])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+ self.assertEqual(lines[1], "1", lines[1])
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
+
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
if __name__ == '__main__':
|
|
![](https://seccdn.libravatar.org/avatar/8f0815ca40ce4faab9f9e18de0af6e5086763783708152871f0dbd160c6a89e1?s=16&d=retro) |
0150951 |
main()
|