使用 ThreadPool 时的最大池大小 Python
Maximum pool size when using ThreadPool Python
我正在使用ThreadPool 来实现多处理。使用多处理时,池大小限制应等于 CPU 核心数。
我的问题 - 使用 ThreadPool 时,池大小限制应该是 CPU 个核心数吗?
这是我的代码
from multiprocessing.pool import ThreadPool as Pool
class Subject():
def __init__(self, url):
#rest of the code
def func1(self):
#returns something
if __name__=="__main__":
pool_size= 11
pool= Pool(pool_size)
objects= [Subject() for url in all_my_urls]
for obj in objects:
pool.apply_async(obj.func1, ())
pool.close()
pool.join()
最大池大小应该是多少?
提前致谢。
不能使用线程进行多处理,只能实现多线程。由于 GIL,多个线程不能 运行 在单个 Python 进程中并发,因此多线程仅在它们 运行ning IO 繁重的工作(例如与互联网交谈)时才有用很多时间等待,而不是 CPU 经常占用核心的繁重工作(例如数学)。
因此,如果您同时处理许多 IO 繁重的任务 运行,那么拥有那么多线程将很有用,即使它超过了 CPU 内核的数量。大量的线程最终会对性能产生负面影响,但在您实际测量问题之前不要担心。大约 100 个线程应该没问题。
不,您不需要将线程池大小限制为与 CPU 核心数相同。如果你在 IO 高吞吐量的情况下使用它,你可以将你的线程池大小调整到一个合适的数字,这有助于你获得最高的 IO 吞吐量,如果增加线程数,你无法获得更高的 IO 吞吐量。
(我发现threadpool的最大线程数只能设置在9000左右,如果更高,Python3.6报错,Google我再看看你的问题)
我正在使用ThreadPool 来实现多处理。使用多处理时,池大小限制应等于 CPU 核心数。 我的问题 - 使用 ThreadPool 时,池大小限制应该是 CPU 个核心数吗?
这是我的代码
from multiprocessing.pool import ThreadPool as Pool
class Subject():
def __init__(self, url):
#rest of the code
def func1(self):
#returns something
if __name__=="__main__":
pool_size= 11
pool= Pool(pool_size)
objects= [Subject() for url in all_my_urls]
for obj in objects:
pool.apply_async(obj.func1, ())
pool.close()
pool.join()
最大池大小应该是多少? 提前致谢。
不能使用线程进行多处理,只能实现多线程。由于 GIL,多个线程不能 运行 在单个 Python 进程中并发,因此多线程仅在它们 运行ning IO 繁重的工作(例如与互联网交谈)时才有用很多时间等待,而不是 CPU 经常占用核心的繁重工作(例如数学)。
因此,如果您同时处理许多 IO 繁重的任务 运行,那么拥有那么多线程将很有用,即使它超过了 CPU 内核的数量。大量的线程最终会对性能产生负面影响,但在您实际测量问题之前不要担心。大约 100 个线程应该没问题。
不,您不需要将线程池大小限制为与 CPU 核心数相同。如果你在 IO 高吞吐量的情况下使用它,你可以将你的线程池大小调整到一个合适的数字,这有助于你获得最高的 IO 吞吐量,如果增加线程数,你无法获得更高的 IO 吞吐量。
(我发现threadpool的最大线程数只能设置在9000左右,如果更高,Python3.6报错,Google我再看看你的问题)