首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >结合使用gevent monkey和线程,可以使线程串行工作

结合使用gevent monkey和线程,可以使线程串行工作
EN

Stack Overflow用户
提问于 2012-02-08 19:36:17
回答 2查看 23.8K关注 0票数 25

我正在使用gevent,我正在修补所有的东西。

它看起来像是猴子补丁导致线程串行工作。

我的代码:

代码语言:javascript
复制
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 (现在显示在上面的代码中)

我的解决方案:

我更改了

代码语言:javascript
复制
monkey.patch_all() 

代码语言:javascript
复制
monkey.patch_all(thread=False)

所以我不是在修补线程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-08 20:02:48

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

执行此操作方法是调用已打补丁的阻塞操作(这将自动生成)或gevent.sleep

代码语言:javascript
复制
#!/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'
票数 32
EN

Stack Overflow用户

发布于 2018-06-08 06:27:26

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

代码语言:javascript
复制
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):
    ...

那么它就会像你所希望的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9192539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档