Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在运行多处理时设置适当的池数_Python_Python 3.x_Web Scraping_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python 如何在运行多处理时设置适当的池数

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上

我正在尝试使用多处理运行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上查询和刮取。我尝试将
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工作序列化最终比并行运行要便宜,但必须处理由
多处理
引入的进程间通信开销

和往常一样,您将需要进行自己的测试,以确定什么最适合您的特定用例