我在Stackoverflow上阅读了许多有关Python多处理的答案,我认为这对我来说是最有用的:python multiprocessing queue implementation。
这是我想做的:轮询数据库以查找新工作,将其放入队列中,并有4个进程连续进行工作。我不清楚的是,当队列中的项目完成处理后会发生什么。在上述问题中,当队列为空时,该过程终止。但是,就我而言,我只是想一直等到队列中有数据。那我只是睡觉并定期检查队列吗?那么我的工人流程将永远不会消亡?那是好习惯吗?
def mp_worker(queue):
while True:
if (queue.qsize() == 0):
time.sleep(20)
else:
db_record = queue.get()
process_file(db_record)
def mp_handler():
num_workers = 4
processes = [Process(target=mp_worker, args=(queue,)) for _ in range(num_workers)]
for process in processes:
process.start()
for process in processes:
process.join()
if __name__ == '__main__':
db_conn = db.create_postgre_connection(DB_CONFIG)
while True:
db_records = db.retrieve_received_files(DB_CONN)
if (len(db_records) > 0):
for db_record in db_records:
queue.put(db_record)
mp_handler()
else:
time.sleep(20)
db_conn.close()
这有意义吗?
谢谢。
答案 0 :(得分:0)
弄清楚了。工人必须死,否则他们就永远不会回来。但是无论如何,当有数据时,我都会开始一组新的工作程序,所以这不是问题。更新的代码:
def mp_worker(queue):
while queue.qsize() > 0 :
db_record = queue.get()
process_file(db_record)
def mp_handler():
num_workers = 4
if (queue.qsize() < num_workers):
num_workers = queue.qsize()
processes = [Process(target=mp_worker, args=(queue,)) for _ in range(num_workers)]
for process in processes:
process.start()
for process in processes:
process.join()
if __name__ == '__main__':
while True:
db_records = db.retrieve_received_files(DB_CONN)
print(db_records)
if (len(db_records) > 0):
for db_record in db_records:
queue.put(db_record)
mp_handler()
else:
time.sleep(20)
DB_CONN.close()