⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadproxy.py

📁 bittorrent source by python. please enjoy
💻 PY
字号:
import sysfrom twisted.internet import reactorfrom BitTorrent.defer import Deferredclass ThreadProxy(object):    __slots__ = ('obj', 'queue_task')    def __init__(self, obj, queue_task):        self.obj = obj        self.queue_task = queue_task    def __gen_call_wrapper__(self, f):        def outer(*args, **kwargs):            df = Deferred()            def inner(*args, **kwargs):                try:                    v = f(*args, **kwargs)                except:                    # hm, the exc_info holds a reference to the deferred, I think                    self.queue_task(df.errback, sys.exc_info())                    #del df                else:                    if isinstance(v, Deferred):                        # v is owned by the caller, so add the callback                        # now, but the task itself should queue.                        # lamdba over df here would break 'del df' above                        # so do it with a local function.                        def make_queueback(func):                            return lambda r : self.queue_task(func, r)                        v.addCallback(make_queueback(df.callback))                        v.addErrback(make_queueback(df.errback))                    else:                        self.queue_task(df.callback, v)            reactor.callFromThread(inner, *args, **kwargs)            return df        return outer    def __getattr__(self, attr):        a = getattr(self.obj, attr)        if callable(a):            return self.__gen_call_wrapper__(a)        return a    def call_with_obj(self, _f, *a, **k):        w = self.__gen_call_wrapper__(_f)        return w(self.obj, *a, **k)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -