使用带有线程的gevent monkey补丁可以使线程串行工作

2024-05-28 19:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用gevent并且我正在修补所有东西。
看起来猴子补丁导致线程连续工作。

我的代码:

import threading
from gevent import monkey; monkey.patch_all()

class ExampleThread(threading.Thread):
    def run(self):
        do_stuff()  # takes a few minutes to finish
        print 'finished working'

if __name__ == '__main__':
    worker = ExampleThread()
    worker.start()
    print 'this should be printed before the worker finished'

因此线程没有按预期工作。
但是,如果我删除monkey.patch_all(),它可以正常工作 问题是我需要monkey.patch_all()来使用gevent(现在显示在上面的代码中)

我的解决方案:

我改变了

monkey.patch_all() 

monkey.patch_all(thread=False)

所以我不补线。


Tags: 代码fromimportgeventall线程classmonkey
2条回答

当线程在gevent中被猴子修补时,它们的行为就像协程一样。这意味着您必须显式地放弃控件,以使其他协程能够执行。

方法是调用已修补的阻塞操作(这将自动产生)或^{}

#!/usr/bin/env python
from gevent import monkey, sleep
monkey.patch_all()
import threading

class ExampleThread(threading.Thread):
    def run(self):
        for i in xrange(10):
            print 'working'
            sleep()

if __name__ == '__main__':
    worker = ExampleThread()
    worker.start()
    print 'this will be printed after the first call to sleep'

如果用Greenlet替换Thread,则可以保留基于线程的类,例如:

from gevent import monkey
from gevent import Greenlet
from threading import Thread


class ThreadLikeGreenlet(Greenlet):
    def __init__(self, name=None, target=None, args=(), kwargs=()):
        super().__init__(target, *args, **dict(kwargs))
        self.name = name

def is_gevent_patched():
    return monkey.is_module_patched('threading')

if is_gevent_patched():
    Thread = ThreadLikeGreenlet  # substitute Thread with Greenlet

class ExampleThread(Thread):
    ...

到时候你想怎么办就怎么办。

相关问题 更多 >

    热门问题