python - 对 IO 绑定但独立的进程使用多处理或异步?
问题描述
我读过关于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 文章,这篇关于 python 并发的文章和一些类似这样的帖子,但我不确定我是否理解得很好。
据我了解,两者asyncio
都threading
受全局解释器锁的限制,这意味着它们不会并行执行,而multiprocessing
不受它的限制。
我首先选择multiprocessing
是因为我可以同时运行每个进程,而且由于它们彼此完全独立,所以很容易做到。
但是,正如您所看到的,我正在处理文件并且几乎不执行任何与 CPU 相关的任务,这意味着有很多等待。从我的读数来看,这意味着我应该改用asyncio
,即使它不是平行的。
如上所述,代码运行良好,但是由于我受 IO 限制,我应该使用asyncio
还是应该坚持使用,multiprocessing
因为每个进程都是完全独立的?
解决方案
推荐阅读
- c# - Visual Studio 2019 设计器,在设计器中设置数组属性会导致弹出“属性值无效”
- amazon-dynamodb - 查询 DynamoDB 时如何指定 ReadCapacityUnits
- scala - 没有变量的Scala轮询循环
- visual-studio-code - 仅对一个单词或短语禁用 vscode 智能感知?
- javascript - 将局部变量作为 Object 属性读取
- python - 如何创建一个列是另一列的移位版本,而忽略熊猫中的重复项?
- reactjs - Dispatch 多个 http 请求 React/Redux
- python - TypeError:Movie() 得到了一个意外的关键字参数“演员”
- python - 在python中将初始化变量作为列表返回
- keyboard - 是否可以在不使用我的物理键盘的情况下在虚拟机上运行 pyautogui?