Python 属性绑定到芹菜中的任务实例

Python 属性绑定到芹菜中的任务实例,python,multithreading,celery,Python,Multithreading,Celery,假设我有: 一个包含3对(登录、密码)的列表,我打算为每对创建一个urllib2开启器 芹菜中的一项任务 并发性=3 我想将每个opener绑定到一个任务实例(这样每个任务都有自己的opener,即使用不同的auth Cookie) 我目前所做的是任务中的子类: class TaskWithOpener(Task): abstract = True _openers = None @property def opene

假设我有:

  • 一个包含3对(登录、密码)的列表,我打算为每对创建一个urllib2开启器
  • 芹菜中的一项任务
  • 并发性=3
我想将每个opener绑定到一个任务实例(这样每个任务都有自己的opener,即使用不同的auth Cookie)

我目前所做的是任务中的子类:

    class TaskWithOpener(Task):
        abstract = True
        _openers = None

        @property
        def openers(self):
            if self._openers is None:
                print 'creating openers for', self
                (...)
            print 'openers already created for ', self, ' just returning them'
            return self._openers
并使任务如下所示:

    @my_celery.task(rate_limit='5/m', base=TaskWithOpener)
    def my_task():
        opener = random.choice(my_task.openers)

但通过这种方式,每个任务都有多个开启器的列表,它们分别为每个线程创建,因此当有3个凭证对(登录、密码)且并发性=3时,我的程序会创建9个开启器,这是不可接受的。

这是芹菜的完全有效行为。基本上,您已经创建了一个类,该类为每个实例创建了三个开瓶器并实例化了三次

您试图做的是生成三个任务,每个任务都有自己的凭据集:

@celery.task(rate_limit='5/m')
def the_task(login, password):
    opener = create_opener(login, password)
    …
然后你可以这样称呼它:

credentials = [
    ('login1', 'password1'),
    ('login2', 'password2'),
    ('login3', 'password3'),
]

for login, password in credentials:
    the_task.delay(login, password)
这样,工人将收到三项任务,并对其应用费率限制

更新:

根据您的评论和代码,我怀疑您希望将选项设置为类属性

问题是覆盖self上的属性会使其成为实例属性

我想你是想创造一个新的世界

老实说,我认为这不是一个好的解决办法。我想知道为什么您不想每次都创建开场白


这是昂贵的吗?那么,您要寻找的不是任务队列+工作者,而是一些持续运行的服务器(可能会被实现)。

这是芹菜的完美行为。基本上,您已经创建了一个类,该类为每个实例创建了三个开瓶器并实例化了三次

您试图做的是生成三个任务,每个任务都有自己的凭据集:

@celery.task(rate_limit='5/m')
def the_task(login, password):
    opener = create_opener(login, password)
    …
然后你可以这样称呼它:

credentials = [
    ('login1', 'password1'),
    ('login2', 'password2'),
    ('login3', 'password3'),
]

for login, password in credentials:
    the_task.delay(login, password)
这样,工人将收到三项任务,并对其应用费率限制

更新:

根据您的评论和代码,我怀疑您希望将选项设置为类属性

问题是覆盖self上的属性会使其成为实例属性

我想你是想创造一个新的世界

老实说,我认为这不是一个好的解决办法。我想知道为什么您不想每次都创建开场白


这是昂贵的吗?那么,您需要的不是任务队列+工作进程,而是一些持续运行的服务器(可能会被实现)。

谢谢。但是,如果我从web界面使用send_task将任务发送到队列,并且工作人员应该是独立的,该怎么办?如果开瓶器是在一台单独的机器上创建的,它还会工作吗?即使如此,我也无法为每个web请求创建开场白,更不用说您建议的每个任务执行了。我需要为每个用户(登录名、密码)创建一次,然后重新使用。你会怎么处理这件事,Krzysiek?看看我的最新消息。请更新您的问题,说明您需要共享“开场白”的原因?它是否在请求之间共享某些状态?此外,你看到了吗?它似乎可以解决您的问题。类属性的行为方式相同-可能是因为我正在Windows上测试它?我需要共享“开启器”,因为创建它们意味着使用给定的代理(前面没有提到)访问网站,使用给定的凭据登录并保存auth cookie。而且多次这样做不仅会导致服务器上不必要的负载,还会导致禁止。我对每一个建议都持开放态度,但似乎我需要使用提前准备好的对象来运行任务(换言之:在给定的上下文中运行任务)。我真的不在乎它们是否是任务的属性,所以我的问题可能表达得很糟糕。grequests很酷,我会在一些小脚本中使用它-但目前获取网站只是故事的一部分(还有解析、保存回数据库等)。你知道cookie jar吗?它们允许您将授权数据存储在某个位置,以便所有任务都可以共享这些数据。谢谢。但是,如果我从web界面使用send_task将任务发送到队列,并且工作人员应该是独立的,该怎么办?如果开瓶器是在一台单独的机器上创建的,它还会工作吗?即使如此,我也无法为每个web请求创建开场白,更不用说您建议的每个任务执行了。我需要为每个用户(登录名、密码)创建一次,然后重新使用。你会怎么处理这件事,Krzysiek?看看我的最新消息。请更新您的问题,说明您需要共享“开场白”的原因?它是否在请求之间共享某些状态?此外,你看到了吗?它似乎可以解决您的问题。类属性的行为方式相同-可能是因为我正在Windows上测试它?我需要共享“开启器”,因为创建它们意味着使用给定的代理(前面没有提到)访问网站,使用给定的凭据登录并保存auth cookie。而且多次这样做不仅会导致服务器上不必要的负载,还会导致禁止。我对每一个建议都持开放态度,但似乎我需要使用提前准备好的对象来运行任务(换言之:在给定的上下文中运行任务)。我真的不在乎它们是否是任务的属性,所以我的问题可能表达得很糟糕。grequests很酷,我会在一些小脚本中使用它-但目前获取网站只是故事的一部分(还有解析、保存回数据库等)。你知道cookie jar吗?它们允许您将授权数据存储在某个位置,以便所有任务都可以共享它们。