Python 如何在运行多处理时设置适当的池数
我正在尝试使用多处理运行web scraper。我在理解池的适当数量时遇到一些问题。我应该使用池的数量作为Python 如何在运行多处理时设置适当的池数,python,python-3.x,web-scraping,multiprocessing,python-multiprocessing,Python,Python 3.x,Web Scraping,Multiprocessing,Python Multiprocessing,我正在尝试使用多处理运行web scraper。我在理解池的适当数量时遇到一些问题。我应该使用池的数量作为cpu\u count(),这是一种规范吗 我的代码如下: def experiment(df,n): with Pool(n) as p: results = p.map(ind_scraper_iterator, df) return(results) df是一个字典列表(长度约3K),而ind\u scraper\u迭代器函数使用字典中的字段从web上
cpu\u count()
,这是一种规范吗
我的代码如下:
def experiment(df,n):
with Pool(n) as p:
results = p.map(ind_scraper_iterator, df)
return(results)
df
是一个字典列表(长度约3K),而ind\u scraper\u迭代器
函数使用字典中的字段从web上查询和刮取。我尝试将n
设置为600和700,但收到一条错误消息BlockingIOError:[Errno 35]资源暂时不可用
。我想这是因为池的数量,我想选择适当的数量,这样我就不会被阻塞。在CPU受限的用例中,是的,您希望池大小不大于可用的CPU内核数量。如果您在池中执行与CPU绑定的工作
,则并行执行的操作不可能超过CPU\u count()
操作,因为根本没有任何CPU可以执行更多操作。一旦池中的进程比CPU多,实际上会影响性能,因为操作系统必须在额外的进程之间切换上下文,以便它们都获得一些CPU时间,这会增加开销
您想要在池中拥有比CPU内核更多的进程的唯一时间是,您在进程中所做的工作是I/O限制的,并且大部分时间都在阻塞,等待I/O完成。等待I/O不会使用任何CPU资源,因此您可以扩展到可用CPU内核的数量之外,而不会减少回报
在您的用例中,您正在进行web抓取,这确实涉及I/O(从web获取数据)。我对细节了解不够,不知道是否有足够的I/O(与获取数据后所做的任何其他操作相比)来证明池大于cpu\u count()
。你必须自己做测试才能找到最佳点。我会说600-700个进程可能太多了,因为运行一个进程会产生相当多的内存开销,并且会使系统过载。如果您的用例被证明是严重I/O绑定的,那么您可能只想使用线程池,因为I/O可以通过线程有效地并行化。只有CPU限制的工作不会释放无法在(C)Python中并行化的GIL。您可能会发现,将少量CPU工作序列化最终比并行运行要便宜,但必须处理由多处理
引入的进程间通信开销
和往常一样,您需要自己进行测试,以确定什么最适合您的特定用例。在CPU受限的用例中,是的,您希望池大小不大于可用的CPU核心数。如果您在池中执行与CPU绑定的工作
,则并行执行的操作不可能超过CPU\u count()
操作,因为根本没有任何CPU可以执行更多操作。一旦池中的进程比CPU多,实际上会影响性能,因为操作系统必须在额外的进程之间切换上下文,以便它们都获得一些CPU时间,这会增加开销
您想要在池中拥有比CPU内核更多的进程的唯一时间是,您在进程中所做的工作是I/O限制的,并且大部分时间都在阻塞,等待I/O完成。等待I/O不会使用任何CPU资源,因此您可以扩展到可用CPU内核的数量之外,而不会减少回报
在您的用例中,您正在进行web抓取,这确实涉及I/O(从web获取数据)。我对细节了解不够,不知道是否有足够的I/O(与获取数据后所做的任何其他操作相比)来证明池大于cpu\u count()
。你必须自己做测试才能找到最佳点。我会说600-700个进程可能太多了,因为运行一个进程会产生相当多的内存开销,并且会使系统过载。如果您的用例被证明是严重I/O绑定的,那么您可能只想使用线程池,因为I/O可以通过线程有效地并行化。只有CPU限制的工作不会释放无法在(C)Python中并行化的GIL。您可能会发现,将少量CPU工作序列化最终比并行运行要便宜,但必须处理由多处理
引入的进程间通信开销
和往常一样,您将需要进行自己的测试,以确定什么最适合您的特定用例