多进程池不会在所有进程之前关闭并加入终止脚本

Posted

技术标签:

【中文标题】多进程池不会在所有进程之前关闭并加入终止脚本【英文标题】:multiprocess pool doesnt close and join terminating the script before all the process 【发布时间】:2020-10-21 11:13:06 【问题描述】:

我创建了一个多处理器应用程序,它只是循环一些文件并比较它们,但由于某种原因,池永远不会关闭并等待加入所有进程响应。

from multiprocessing import Pool
def compare_from_database(row_id, connection_to_database):
    now = datetime.now()
    connection1 = sqlite3.connect(connection_to_database)
    cursor = connection1.cursor()

    grab_row_id_query = "SELECT * FROM MYTABLE WHERE rowid = 0;".format(row_id)
    grab_row_id = cursor.execute(grab_row_id_query)
    work_file_path = grab_row_id.fetchone()[1]

    all_remaining_files_query = "SELECT * FROM MYTABLE WHERE rowid > 0;".format(row_id)
    all_remaining_files = cursor.execute(all_remaining_files_query)
    for i in all_remaining_files:
        if i[1] == work_file_path:
            completed_query = "UPDATE MYTABLE SET REPEATED = 1 WHERE ROWID = 1;".format(row_id)
            work_file = cursor.execute(completed_query)
            connection1.commit()
    cursor.close()
    connection1.close()    
    return "id 0 took: 1".format(row_id, datetime.now()-now)

我试过了:

def apply_async(range_max, connection_to_database):
    pool = Pool()
    for i in range_of_ids:
        h = pool.apply_async(compare_from_database, args=(i, connection_to_database))
    pool.close()
    pool.join()

还使用上下文和强制它:

from multiprocessing import Pool
with Pool() as pool:
    for i in range_of_ids:
        h = pool.apply_async(compare_from_database, args=(i, connection_to_database))
    pool.close()
    pool.join()

即使使用上下文也不应该需要关闭/加入。

脚本只是提交所有作业,我可以在任务管理器中看到所有 python 实例并正在运行,函数内部的打印语句确实可以在控制台中打印,但是一旦主脚本完成将所有函数提交到游泳池,刚刚结束。不尊重关闭/加入

Process finished with exit code 0

如果我自己运行该函数,则返回字符串运行良好。

compare_from_database(1, connection_to_database="my_path/sqlite.db")

或者在循环中也可以正常工作

for i in range(1, 4):
    compare_from_database(i, connection_to_database="my_path/sqlite.db")

我尝试使用 python 3.7 和 3.8 并希望通过文档对其进行验证 https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.join

有人遇到过类似的问题或有什么想法吗?

【问题讨论】:

你能告诉我们 compare_from_database 或告诉我们输出吗?你能验证 h 不包含输出列表吗?现在代码将在不知不觉中完成 【参考方案1】:

因为您想在继续执行脚本的下一部分之前完成所有过程 更改“异步”而不是 async_apply 以强制运行进程并等待 结果。

【讨论】:

以上是关于多进程池不会在所有进程之前关闭并加入终止脚本的主要内容,如果未能解决你的问题,请参考以下文章

Python多处理池:完成任何k个作业后终止进程

进程-进程池Pool

进程-进程池Pool

你如何让多处理池不启动新进程但也不终止当前正在运行的进程?

Python多处理:如何在异常时关闭多处理池

Python多进程池 multiprocessing Pool