我试图用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 length
秒(模拟工作)并以状态(原型成功)响应。我是Python新手,请有人帮助我为我的应用程序选择框架/库。我目前的状态是:
几乎所有工作进程都由C扩展模块执行
我不知道如何启动工作程序:我应该生成线程/ greenlet还是应该派生一个新进程?
请告知。
答案 0 :(得分:0)
对母版/工作者架构了解不多,但是您可以使用pika/RabbitMQ + Celery进行事件处理和任务队列。
考虑使用RabbitMQ代替Postgres进行事件-see some discussion here。
希望有帮助。
答案 1 :(得分:0)
我个人认为,ASync可能是您最好的选择。您可以查看GIPC,它可以多进程处理gevent,并为您提供来回读写通道。或者,您可以让他们通过restAPI进行通信。
个人而言,我将启动两个不同的进程,一个管理池并处理队列的主通道。然后,我会让工作进程在API上拨出新的工作,当他们检索工作时,他们会在一个单独的线程中开展业务。
这样做的好处是,当您要将工作人员拆分到其他计算机(微型计算机)时,唯一需要的更改是IP地址。