Используете многопроцессорность или асинхронность для процессов ввода-вывода, но независимых процессов? - PullRequest
0 голосов
/ 24 апреля 2019

Я читал о 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, потому что каждый процесс полностью независим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...