将多处理或异步用于IO绑定但独立的进程?

时间:2019-04-24 16:03:40

标签: python multithreading multiprocessing python-asyncio

我已经读过有关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 article的有关这些库的知识,this的有关python并发的文章以及一些类似one的SO帖子,但是我不确定我是否理解得很好。 / p>

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

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

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

如上所述,代码可以正常工作,但由于受IO限制,我应该使用asyncio还是应该坚持使用multiprocessing,因为每个进程都是完全独立的?

0 个答案:

没有答案