小编enp*_*nax的帖子

Gunicorn,Django,Gevent:Spawned线程正在阻塞

我们最近切换到Gunicorn使用GEVENT工人.

在我们的网站上,我们有一些需要一段时间才能完成的任务.超过30秒.

前言

我们已经完成了整个芹菜的事情,但这些任务很少运行,以至于不能让芹菜和redis一直运行.我们只是不想那样.我们也不想按需开始芹菜和红葡萄酒.我们想要摆脱它.(我为此感到抱歉,但我想阻止这样的答案:"为什么不使用芹菜,这太好了!")

我们想要异步运行的任务

我说的是执行3000个SQL查询(插入)的任务,这些查询必须一个接一个地执行.这种情况并非经常发生.我们仅限于同时运行其中两项任务.他们应该花2-3分钟.

该方法

现在,我们现在正在做的是利用gevent worker和gevent.spawn任务并返回响应.

问题

我发现生成的线程实际上是阻塞的.一旦返回响应,任务就会开始运行,并且在任务停止运行之前不会处理任何其他请求.任务将在30多岁后被枪杀timeout.为了防止这种情况,我time.sleep()在每个其他SQL查询之后使用,因此服务器有机会响应请求,但我不觉得这是重点.

设置

我们运行gunicorn,django并使用gevent.描述的行为发生在我的开发环境中并使用1 gevent worker.在生产中,我们也只运行一名工人(现在).此外,在任务阻塞时,运行2名工作人员似乎无助于提供更多请求.

TLDR

  • 我们认为在我们的2分钟任务中使用gevent线程是可行的(芹菜上)
  • 我们使用gunicorn和gevent,并想知道为什么用gevent.spawn产生的线程阻塞
  • 是阻止意图还是我们的设置错了?

谢谢!

python django multithreading gevent gunicorn

6
推荐指数
1
解决办法
3775
查看次数

从继承的实例访问本地类变量

我有我的伪接口,我实现了几次.每个实现都应该存储一个基本上定义文件路径(模板)的变量.因为这些类是由工厂生成的,所以我不知道会出现哪个子类,因此,我想通过实例方法访问类变量.

这并不会造成问题,但是,当我从我的Interface继承时,我不想getHidden()多次实现该方法(在下面).但是把它称之为它所记录的方式,总会隐藏起来.

class MySuperInterface(object):
    # class Variable
    __much = "hidden"

    # instance method
    def getHidden(self):
        print self.__class__.__much

class MySub(MySuperInterface):
    __much = "this is different per subclass!"

    def soTroublesome(self):
        print self.__class__.__much
Run Code Online (Sandbox Code Playgroud)

执行

>>> sub = MySub() # I don't know this class!

>>> sub.getHidden()
hidden

>>> sub.soTroublesome()
this is different per subclass!
Run Code Online (Sandbox Code Playgroud)

那么,我如何实现getHidden()访问实例的类'classvariable.我知道,我检查过的信息是可用的dir(),但我不知道如何访问它.同样,我不想最终得到一个类/静态方法,因为我不知道从我的工厂出来的类!

谢谢!

python inheritance class-variables

1
推荐指数
1
解决办法
51
查看次数