如何在Python中并行处理列表?[复制]

rks48beu  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(121)

此问题在此处已有答案

Is there a simple process-based parallel map for python?(5个答案)
四年前关闭了。
我写了这样的代码:

def process(data):
   #create file using data

all = ["data1", "data2", "data3"]

我想在我的所有列表上并行执行进程函数,因为它们正在创建小文件,所以我不关心磁盘写入,但处理需要很长时间,所以我想使用我所有的核心。
如何在python 2.7中使用默认模块实现这一点?

c9x0cxw0

c9x0cxw01#

假设CPython和GIL在这里。
如果你的任务是I/O绑定的,一般来说,线程可能会更有效,因为线程只是将工作转储到操作系统上,并在I/O操作完成之前一直处于空闲状态。
然而,大多数文件系统不是并发的,所以使用多线程或多处理 * 可能 * 并不比同步写快。
尽管如此,这里有一个人为的multiprocessing.Pool.map示例,它可能有助于您的CPU绑定工作:

from multiprocessing import cpu_count, Pool

def process(data):
    # best to do heavy CPU-bound work here...

    # file write for demonstration
    with open("%s.txt" % data, "w") as f:
        f.write(data)

    # example of returning a result to the map
    return data.upper()
      
tasks = ["data1", "data2", "data3"]
pool = Pool(cpu_count() - 1)
print(pool.map(process, tasks))

类似的线程设置可以在concurrent.futures.ThreadPoolExecutor中找到。
顺便说一句,all是一个内置函数,不是一个很好的变量名选择。

hjzp0vay

hjzp0vay2#

或者:

from threading import Thread

def process(data):
    print("processing {}".format(data))

l= ["data1", "data2", "data3"]

for task in l:
    t = Thread(target=process, args=(task,))
    t.start()

或者(仅限python版本〉3.6.0):

from threading import Thread

def process(data):
    print(f"processing {data}")

l= ["data1", "data2", "data3"]

for task in l:
    t = Thread(target=process, args=(task,))
    t.start()
oyxsuwqo

oyxsuwqo3#

这里有一个使用multiprocessing的模板,希望对大家有所帮助。

from multiprocessing.dummy import Pool as ThreadPool

def process(data):
    print("processing {}".format(data))
alldata = ["data1", "data2", "data3"]

pool = ThreadPool()

results = pool.map(process, alldata)

pool.close()
pool.join()

相关问题