【发布时间】:2014-11-03 21:58:23
【问题描述】:
我有一个 python 函数,执行大约需要 1 分钟。我需要为我的数据库中的每个用户运行它。在最短的时间内执行的最佳方法是什么? (假设我不能减少 fn 执行时间)。我应该为每个用户创建多个线程吗? (我无法控制用户数量)。
【问题讨论】:
标签: python multithreading scalability
我有一个 python 函数,执行大约需要 1 分钟。我需要为我的数据库中的每个用户运行它。在最短的时间内执行的最佳方法是什么? (假设我不能减少 fn 执行时间)。我应该为每个用户创建多个线程吗? (我无法控制用户数量)。
【问题讨论】:
标签: python multithreading scalability
假设你的慢函数很慢,因为它是 CPU 密集型的,为每个用户生成一个线程可能是一种危险,如果你有一个大数据库,你可能会有数千个线程竞争资源。您可以使用multiprocessing.Pool 来拥有一个工人池:
from multiprocessing import Pool
def f(user):
# do something
users = ['Alice', 'Bob', 'Carol', 'Dave']
pool = Pool(processes=10)
results = pool.map(f, users)
即使users 是一千个名字的列表,你也总是最多有 10 个进程同时运行。您应该根据您的机器拥有的内核数来设置进程数。
【讨论】:
processes 为您的设置找到一个合适的数字。