我尝试使用python中的队列,它将是多线程的。我只想知道我使用的方法是正确的还是错误的。如果我在做一些多余的事情,或者有更好的方法可以使用。在
我试图从表中获取新的请求,并使用一些逻辑来调度它们,以执行一些操作,比如运行查询。在
所以在这里,我从主线程为队列生成一个单独的线程。在if __name__=='__main__':
request_queue = SetQueue(maxsize=-1)
worker = Thread(target=request_queue.process_queue)
worker.setDaemon(True)
worker.start()
while True:
try:
#Connect to the database get all the new requests to be verified
db = Database(username_testschema, password_testschema, mother_host_testschema, mother_port_testschema, mother_sid_testschema, 0)
#Get new requests for verification
verify_these = db.query("SELECT JOB_ID FROM %s.table WHERE JOB_STATUS='%s' ORDER BY JOB_ID" %
(username_testschema, 'INITIATED'))
#If there are some requests to be verified, put them in the queue.
if len(verify_these) > 0:
for row in verify_these:
print "verifying : %s" % row[0]
verify_id = row[0]
request_queue.put(verify_id)
except Exception as e:
logger.exception(e)
finally:
time.sleep(10)
现在在Setqueue类中,我有一个process_queue函数,用于处理添加到队列的每次运行中前2个请求。在
^{pr2}$
我想看看我的理解是否正确,是否有任何问题。在
因此,在main func中为True时运行的主线程将获取新请求并将其放入队列中。队列的工作线程(守护进程)继续从队列获取新请求,并派生执行处理的非守护进程线程,由于加入超时为1,工作线程将继续接收新请求而不会被阻塞,其子线程将继续在后台处理。对的?在
因此,如果主进程退出,它们在完成工作之前不会被杀死,但是工作守护进程线程会退出。
怀疑:如果父进程是守护进程,子进程是非后台进程,如果父进程退出,子进程是否退出?)。在
作者:davidbeazley在《将池用作线程协处理器》一节中试图解决类似的问题。所以我应该遵循他的步骤:-
1创建一个进程池。
2像我为request_queue打开一个线程
三。在那条线里def process_verification_queue(self):
while True:
try:
if self.qsize() > 0:
job_id = self.get()
pool.apply_async(Scheduler.verify_func, args=(job_id,))
except Exception as e:
logger.exception("QUEUE EXCEPTION : Exception occured while processing requests in the VERIFICATION QUEUE")
使用池中的进程并并行运行verify_func。这会给我更多的表现吗?在