Python 从Django应用程序触发分布式异步处理的好架构是什么?

Python 从Django应用程序触发分布式异步处理的好架构是什么?,python,django,linux,shell,architecture,Python,Django,Linux,Shell,Architecture,我将构建一个Django应用程序,它提供一个RESTAPI来添加一些处理作业 在每个请求中,都会将一个作业添加到数据库中以供以后处理 作业可以通过自定义命令处理(/manage.py runJobs) 这些工作是CPU密集型的,所以如果我在一台有4核的机器上运行, 我希望最多有4名工人同时执行工作 如果我需要扩展,我需要能够在不同的机器上运行更多的操作系统 处理作业会占用大量内存,因此可能最好为每个作业创建一个新进程,也就是说,我认为最好是/manage.py runJobs运行一个作业并退出,

我将构建一个Django应用程序,它提供一个RESTAPI来添加一些处理作业

在每个请求中,都会将一个作业添加到数据库中以供以后处理

作业可以通过自定义命令处理(
/manage.py runJobs

这些工作是CPU密集型的,所以如果我在一台有4核的机器上运行, 我希望最多有4名工人同时执行工作

如果我需要扩展,我需要能够在不同的机器上运行更多的操作系统

处理作业会占用大量内存,因此可能最好为每个作业创建一个新进程,也就是说,我认为最好是
/manage.py runJobs
运行一个作业并退出,而不是在同一进程中运行多个作业

我需要确保比赛条件不会导致两名工人得到同一份工作

我不太熟悉linux进程之间的通信,所以我认为来这里学习技巧是个好主意


您建议采用什么体系结构来解决此问题?

我认为我找到了一个足够好的解决方案,它允许我将数据库用作信号量,并且不需要我在服务器上安装其他软件

它是这样的:

------自定义命令------

------worker.sh-------

然后,我可以生成尽可能多的worker.sh实例,只要核心可用。 这并不理想,因为每秒都会有一群工作人员轮询数据库, 但它确实解决了最大的风险:两次运行同一个作业。 我想我会用这个:-)


如果您发现此方法中存在任何漏洞,请告诉我。

听起来像是一份适合您的工作,因为您已经在使用Python/Django,我建议您看看。就架构本身而言,我建议使用类似的工作队列(来自RabbitMQ网站)。
from django.db import transaction

def run_one_job():
    candidate_jobs = Job.objects.filter(status='PENDING')
    job = lock_one_job_from_list(candidate_jobs)
    if job:
        process(job)  # whatever that means
        job.status = 'DONE'
        job.save()

def lock_one_job_from_list(jobs):
    for job in jobs:
        _job = attempt_lock_job(job.id)
        if _job:
            return _job


@transaction.commit_on_success
def attempt_lock_job(id):
    j = Job.objects.select_for_update(id=id)[0]  # wait until you get a write lock for that record
    if j.status == 'PENDING':
        j.status = 'RUNNING'
        j.save()
        return j
while [ 1 ]
do
./manage.py runJobs
sleep 1
done