Python多处理进程终止了吗?

时间:2018-07-19 13:46:56

标签: python python-multiprocessing

我在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()

这有意义吗?

谢谢。

1 个答案:

答案 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()