uWSGI重新启动附加进程而不停止旧进程

时间:2016-11-16 16:55:23

标签: python django multithreading uwsgi

我有一个网络应用程序,需要几个自定义消费者脚本与主Django应用程序并行运行。由于我已经使用uWSGI运行Django应用程序,我想我会使用emperor模式和attach-daemon配置来启动我的其他进程与主应用程序同时。它适用于除一个以外的每个进程。此过程与其他过程之间的区别在于,此过程会分叉多个工作线程,这些线程从主进程填充的队列中选择作业。相关代码如下所示

def worker(q):
    while True:
        item = q.get()
        ... do things with the item ...
        q.task_done()

def heartbeat():
    the_queue = Queue()
    # create the thread pool
    for n in range(NUMBER_OF_THREADS):
        t = threading.Thread(target=worker, args=(the_queue,))
        t.setDaemon(True)
        t.start()

    while True:
        # mark the start time
        start_time = datetime.utcnow()

        # use Django ORM to get a list of devices
        for device in Device.objects.all():
            the_queue.put(device)
        # wait for workers to deal with things
        the_queue.join()
        # mark the end time
        end_time = datetime.utcnow()
        time.sleep(SOME_CALCULATED_AMOUNT)

if __name__ == "__main__":
    heartbeat()

此过程的uWSGI配置如下所示

[uwsgi]
master = true
enable-threads=true

chdir=somedir

uid=ubuntu
gid=ubuntu

pidfile=somepath
daemonize=somepath

env=DJANGO_SETTINGS_MODULE=settings
attach-daemon2 = cmd=python3 heartbeat/heartbeat.py,control=true

我已经尝试了启用线程和没有我尝试使用常规attach-daemon并且两者都导致相同的事情。这个过程开始很好,但过了一段时间我会看到两个然后更多的进程产生,而日志中没有任何显示。如果我停止uWSGI,只有一个生成的进程被杀死,其他进程继续运行。几乎就好像uWSGI认为这个过程已经死亡并重新启动它,而实际上这个过程从未死亡过。

我知道流程实施并不是最好的。如果没有别的帮助,我会尝试重新实现它以根据需要生成线程而不是保留线程池。

0 个答案:

没有答案