- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一大堆必须以某种方式处理的元素。我知道可以通过以下方式使用多处理过程来完成:
pr1 = Process(calculation_function, (args, ))
pr1.start()
pr1.join()
所以我可以创建假设 10 个进程并将参数按 10 分割传递给 args。然后工作就完成了。
但我不想手动创建它并手动计算它。相反,我想使用 ProcessPoolExecutor我是这样做的:
executor = ProcessPoolExecutor(max_workers=10)
executor.map(calculation, (list_to_process,))
计算是我完成这项工作的功能。
def calculation(list_to_process):
for element in list_to_process:
# .... doing the job
list_to_process 是我要处理的列表。
但是在运行这段代码之后,循环迭代只进行了一次。我以为
executor = ProcessPoolExecutor(max_workers=10)
executor.map(calculation, (list_to_process,))
和这个一样10次:
pr1 = Process(calculation, (list_to_process, ))
pr1.start()
pr1.join()
但是好像不对。
ProcessPoolExecutor如何实现真正的多进程?
最佳答案
从 calculation
函数中移除 for
循环。现在您正在使用 ProcessPoolExecutor.map
,map()
调用是您的循环,区别在于列表中的每个元素是发送到不同的进程。例如
def calculation(item):
print('[pid:%s] performing calculation on %s' % (os.getpid(), item))
time.sleep(5)
print('[pid:%s] done!' % os.getpid())
return item ** 2
executor = ProcessPoolExecutor(max_workers=5)
list_to_process = range(10)
result = executor.map(calculation, list_to_process)
您会在终端中看到如下内容:
[pid:23988] performing calculation on 0
[pid:10360] performing calculation on 1
[pid:13348] performing calculation on 2
[pid:24032] performing calculation on 3
[pid:18028] performing calculation on 4
[pid:23988] done!
[pid:23988] performing calculation on 5
[pid:10360] done!
[pid:13348] done!
[pid:10360] performing calculation on 6
[pid:13348] performing calculation on 7
[pid:18028] done!
[pid:24032] done!
[pid:18028] performing calculation on 8
[pid:24032] performing calculation on 9
[pid:23988] done!
[pid:10360] done!
[pid:13348] done!
[pid:18028] done!
[pid:24032] done!
虽然事件的顺序实际上是随机的。返回值(至少在我的 Python 版本中)实际上是一个 itertools.chain
。出于某种原因反对。但这是一个实现细节。您可以将结果作为列表返回,例如:
>>> list(result)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在您的示例代码中,您传递了一个单元素元组 (list_to_process,
),这样只会将您的完整列表传递给一个进程。
关于python - 使用 ProcessPoolExecutor 进行并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863932/
python ProcessPoolExecutor 在命令行中工作,但添加到函数后不运行 它是这样工作的 from concurrent import futures def multi_proce
如果父进程因任何原因终止,有没有办法使 concurrent.futures.ProcessPoolExecutor 中的进程终止? 一些细节:我在处理大量数据的作业中使用 ProcessPoolEx
这是我关于 stackoverflow 的第一个问题。我基本上能够在这里找到我需要知道的东西。顺便说一句,非常感谢。 但是。如果我尝试终止我的 ProcessPoolExecutor,它只会在生成的整
我有一个代码,它从 gstorage 下载文件,将它们转储到 json,然后将该 json 转为 csv,然后转为 parquet,最后上传到 aws s3(不要问为什么我不是写它的人)。 我从我的日
ESPNP 播放器免费 class ESPNPlayerFree: def __init__(self, player_id, match_id, match_id_team): ... 团队列表1:
在本文档 ( https://pymotw.com/3/concurrent.futures/ ) 中说: “ProcessPoolExecutor 的工作方式与 ThreadPoolExecutor
我正在创建一个多处理程序来处理多个批处理,但我的日志记录无法将批处理记录到日志文件中,只会记录根 log.info,如何设置日志记录以正确打印到日志文件? 日志只会打印这样一行"INFO:root:t
我正在尝试使用一个单独的进程通过并发 future 流式传输数据。然而,另一方面,有时对方会停止数据馈送。但只要我重新启动这个 threadable 然后它就会再次工作。所以我设计了这样的东西,以便能
设置 我设置了一个函数来接收多个关键字参数: def process(image, folder, param1, param2, param3): do_things return
from concurrent.futures import ProcessPoolExecutor import os import time def parInnerLoop(item):
python 3.6.6 这是代码: import asyncio import time from concurrent.futures import ProcessPoolExecutor exe
我是一般并行化的新手,特别是 concurrent.futures。我想对我的脚本进行基准测试并比较使用线程和进程之间的差异,但我发现我什至无法运行它,因为在使用 ProcessPoolExecuto
代码: if __name__ == "__main__": p = ProcessPoolExecutor() p.submit(lambda x: print(x), "somet
代码: if __name__ == "__main__": p = ProcessPoolExecutor() p.submit(lambda x: print(x), "somet
我想在多进程环境中记录到单个文件。我可以得到 sample code从 python 日志记录手册开始工作。但是当我替换为 ProcessPoolExecutor 时,它不起作用。 # work
我正在尝试使用新的 Tornado queue对象以及 concurrent.futures允许我的网络服务器将 CPU 密集型任务传递给其他进程。我想访问从 concurrent.futures 模
我有一个 python 函数正在调用我无法控制或更新的 C 库。不幸的是,C 库存在间歇性错误,有时会挂起。为了防止我的应用程序也挂起,我尝试隔离 ThreadPoolExecutor 或 Proce
我最近开始使用 Python 的多线程和多处理功能。 我尝试编写代码,使用生产者/消费者方法从 JSON 日志文件中读取 block ,将这些 block 作为事件写入队列,然后启动一组将从该队列中轮
我有一大堆必须以某种方式处理的元素。我知道可以通过以下方式使用多处理过程来完成: pr1 = Process(calculation_function, (args, )) pr1.start() p
if __name__ == '__main__': MATCH_ID = str(doc_ref2.id) MATCH_ID_TEAM = doc_ref3.id with
我是一名优秀的程序员,十分优秀!