我有一个网络应用程序,需要几个自定义消费者脚本与主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认为这个过程已经死亡并重新启动它,而实际上这个过程从未死亡过。
我知道流程实施并不是最好的。如果没有别的帮助,我会尝试重新实现它以根据需要生成线程而不是保留线程池。