首页 > 解决方案 > 对 IO 绑定但独立的进程使用多处理或异步?

问题描述

我读过关于multiprocessingthreadingasyncio我不太确定我应该使用哪一个来处理我的情况。

我正在尝试解析 tsv 文件并将它们放入不同的 SQLite 文件中(每个文件只写入一次)。以下代码工作得很好,我的问题更多是关于理解为什么我应该在这种情况下使用一个而不是另一个。

def read_large_file(f):
    for l in f:
        yield l.strip().split()


def worker(infile):
        with sqlite3.connect(infile+".sqlite") as connection, open(infile) as f:
        connection.execute("""
            CREATE TABLE IF NOT EXISTS test (
                field1 TEXT PRIMARY KEY,
                field2 TEXT,
                field3 TEXT
            )""")

        next(f)  # ignore header
        connection.executemany("INSERT INTO test VALUES (?, ?, ?)", read_large_file(f))
    connection.close()


if __name__ == "__main__":
    infiles = [f for f in Path("../data/").glob("test_*_.csv")]
    pool = multiprocessing.Pool(processes=len(infiles))
    pool.map(create_sqlite, infiles)
    pool.close()
    pool.join()

我已经阅读了关于这些库的realpython 文章,这篇关于 python 并发的文章和一些类似这样的帖子,我不确定我是否理解得很好。

据我了解,两者asynciothreading受全局解释器锁的限制,这意味着它们不会并行执行,而multiprocessing不受它的限制。

我首先选择multiprocessing是因为我可以同时运行每个进程,而且由于它们彼此完全独立,所以很容易做到。

但是,正如您所看到的,我正在处理文件并且几乎不执行任何与 CPU 相关的任务,这意味着有很多等待。从我的读数来看,这意味着我应该改用asyncio,即使它不是平行的。

如上所述,代码运行良好,但是由于我受 IO 限制,我应该使用asyncio还是应该坚持使用,multiprocessing因为每个进程都是完全独立的?

标签: pythonmultithreadingmultiprocessingpython-asyncio

解决方案


推荐阅读