Python中的master-workers实现

时间:2019-04-24 11:53:16

标签: python

我试图用Python实现我的应用程序的原型,并坚持选择库,框架...

该应用程序是一个master-workers应用程序(事件循环?),在其中,工作人员向master请求他们应该做的工作,并以其工作结果响应master。 所有任务(作品)都存储在PostgreSQL表中,并且只有master可以访问其数据。该表如下所示:

task(task_id int, status varchar, length int, error_msg varchar)

主流程应具有以下通往外界的API方法(REST / HTTP):

  • get_workers_count:退出工作人员人数。第一次启动时,工人的初始数量为0
  • set_workers(workers_count):设置新的工人数。如果新计数大于当前计数,则主机应产生新的工人。如果新员工人数少于当前员工人数,则某些工人应在完成当前工作后死亡
  • add_task(time):在任务表中添加状态为“ READY”且长度等于时间的tsak

主流程还应向工作人员提供以下API方法(外界不应接受):

  • get_task返回task_id和任务表中状态为“ READY”的第一条记录的长度。返回工作人员后,它将状态更改为“正在执行”。如果没有要执行的任务,则返回-1。如果工人死亡,则返回-2。
  • set_task_status (task_id, status)-设置任务状态

工作进程应由主进程运行,其工作方式如下:

  • 呼叫主控台的get_task method。如果得到-2,则终止。如果为-1,它将进入休眠状态并再次调用get_task_again
  • 如果任务编号为正,则ot睡眠length秒(模拟工作)并以状态(原型成功)响应。

我是Python新手,请有人帮助我为我的应用程序选择框架/库。我目前的状态是:

  • 我想在主流程中将Flask / gunicorn用于REST Api
  • 我不知道该如何使用主/工作进程之间的通信。 SocketServer对我来说是一个不错的选择吗?
  • 几乎所有工作进程都由C扩展模块执行

    -工人和主人将在一台机器上工作

  • 我不知道如何启动工作程序:我应该生成线程/ greenlet还是应该派生一个新进程?

请告知。

2 个答案:

答案 0 :(得分:0)

对母版/工作者架构了解不多,但是您可以使用pika/RabbitMQ + Celery进行事件处理和任务队列。

考虑使用RabbitMQ代替Postgres进行事件-see some discussion here

希望有帮助。

答案 1 :(得分:0)

我个人认为,ASync可能是您最好的选择。您可以查看GIPC,它可以多进程处理gevent,并为您提供来回读写通道。或者,您可以让他们通过restAPI进行通信。

个人而言,我将启动两个不同的进程,一个管理池并处理队列的主通道。然后,我会让工作进程在API上拨出新的工作,当他们检索工作时,他们会在一个单独的线程中开展业务。

这样做的好处是,当您要将工作人员拆分到其他计算机(微型计算机)时,唯一需要的更改是IP地址。