【问题标题】:Django background executorDjango后台执行器
【发布时间】:2016-07-26 11:18:07
【问题描述】:

我正在尝试在队列中运行多个任务。任务来自用户输入。我尝试的是创建一个具有 ThreadPoolExecutor 属性的单例类并向其中添加任务。任务添加得很好,但看起来只有第一个添加的任务集有效。以下是添加但未执行的。

class WebsiteTagScrapper:
   class __WebsiteTagScrapper:
       def __init__(self):
           self.executor = ThreadPoolExecutor(max_workers=5)
   instance = None

   def __new__(cls):  # __new__ always a classmethod
       if not WebsiteTagScrapper.instance:
           WebsiteTagScrapper.instance = WebsiteTagScrapper.__WebsiteTagScrapper()
       return WebsiteTagScrapper.instance

【问题讨论】:

  • 你可以发布一个 MCVE (stackoverflow.com/help/mcve) 吗?或者至少这个东西是如何在你的代码中实际使用的?
  • 另外,请注意,Django 经常使用多处理服务,甚至有时在负载均衡器后面的多台服务器上提供服务,因此您的“单例”仅对于给定进程的“单例”给定的服务器。它显然不会在进程和服务器之间共享......
  • @brunodesthuilliers 哇,很高兴知道。我在我的 api 中调用这个类并将来自 POST 的输入 url 作为参数传递
  • @brunodesthuilliers 我看到有人建议使用 celery,但我认为这太过分了
  • celery 对您的用例来说可能会或不会过分杀伤力 - 无法判断 - 但它是最常被建议的解决方案是有原因的:正确处理分布式异步任务队列并非易事。但是您可以考虑一些更简单/更轻量级的解决方案,参见djangopackages.com/grids/g/workers-queues-tasks

标签: python django executor


【解决方案1】:

我在我的一个项目中使用了多进程而不使用 celery,因为我认为这对我的使用来说太过分了。 也许你可以这样做:

from multiprocessing import Process

class MyQueuProcess(Process):
    def __init__(self):
        super(MyQueuProcess, self).__init__()
        self.tasks = []


    def add_task(self, task):
        self.tasks.append(task)


    def run(self):
        for task in self.tasks:
            #Do your task

您只需在视图中创建一个实例,设置您的任务,然后run()。此外,如果您需要访问您的数据库,您需要在您的孩子中import django,然后创建一个django.setup()

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2016-05-04
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多