Python 中的 C# Parallel.Foreach 等效项

Posted

技术标签:

【中文标题】Python 中的 C# Parallel.Foreach 等效项【英文标题】:C# Parallel.Foreach equivalent in Python 【发布时间】:2015-05-28 00:01:22 【问题描述】:

我有 96 个 txt 文件需要处理。现在我正在使用一个 for 循环,一次只做一个,这个过程非常慢。生成的 96 个文件,不需要合并。有没有办法让它们并行运行,比如 C# 中的 Parallel.foreach? 当前代码:

for src_name in glob.glob(source_dir+'/*.txt'):
   outfile = open (...)
   with open(...) as infile:
      for line in infile:
         --PROCESS--
   for --condition--:
      outfile.write(...)
   infile.close()
   outfile.close()

希望此进程对 source_dir 中的所有文件并行运行。

【问题讨论】:

这个过程是否需要很长时间,或者这是读数? 对于具有 GIL(全局解释器锁)的 CPython,您需要使用 multiprocessing 模块。但是你很幸运,因为已经有许多第三方库基于多处理并行计算。 docs.python.org/3/library/multiprocessing.html @Thomas:96个文件的总处理时间很慢。我正在尝试改善单个文件的处理时间,但如果有并行线程就像它在 C# 中的完成方式一样简单,那就太好了 @Reise45 是总是相同的 96 个文件吗?处理多长时间(以行为单位)? 【参考方案1】:

假设限制因素确实是处理而不是 I/O,您可以使用 joblib 在多个 CPU 上轻松运行循环。

simple example from their documentation:

>>> from math import sqrt
>>> from joblib import Parallel, delayed
>>> Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in range(10))
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

【讨论】:

以上是关于Python 中的 C# Parallel.Foreach 等效项的主要内容,如果未能解决你的问题,请参考以下文章

c# 异步编程学习笔记

c# 异步编程学习笔记

c# 异步编程学习笔记

C#之任务,线程和同步

c# 并发编程系列之三:使用 Parallel 开始第1个多线程编码

C#并发编程之初识并行编程