Я читал о multiprocessing
, threading
и asyncio
, но я не совсем уверен, какой из них мне следует использовать для моего случая.
Я пытаюсь разобрать файлы 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 о техlibrairies, эта статья о параллелизме в python и несколько SO-сообщений вроде этого one , но я не уверен, что хорошо понял.
Из того, что я понял, обаasyncio
и threading
ограничены глобальной блокировкой интерпретатора, что означает, что они не выполняются параллельно, в то время как multiprocessing
не ограничивается этим.
Сначала я выбираю multiprocessing
, потому что я могу запустить каждый процессв то же время, поскольку они полностью независимы друг от друга, это было довольно легко сделать.
Однако, как вы можете видеть, я работаю с файлами и почти не выполняю никаких задач, связанных с процессором, то естьтам много ожидания.Из моих показаний это означает, что вместо этого я должен использовать asyncio
, даже если он не параллелен.
Как сказано выше, код работает нормально, но я должен, так как я связан с IO, использовать asyncio
или я должен придерживаться multiprocessing
, потому что каждый процесс полностью независим?