为什么ProcessPoolExecutor和Pool在调用Super()时崩溃?

`ProcessPoolExecutor` 和 `Pool` 在 Python 中都是用于并行处理任务的类,但它们在使用过程中可能会遇到问题。问题出现在调用 `super()` 时崩溃。这通常是因为 `ProcessPoolExecutor` 和 `Pool` 的子类没有正确地初始化父类的属性。

下面是一个使用 `ProcessPoolExecutor` 和 `Pool` 并在调用 `super()` 时崩溃的示例代码:

```python
from concurrent.futures import ProcessPoolExecutor, Pool

class MyExecutor(ProcessPoolExecutor):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._initialized = True

    def submit(self, fn, *args, **kwargs):
        if not self._initialized:
            raise RuntimeError("Executor not initialized")
        return super().submit(fn, *args, **kwargs)

class MyPool(Pool):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._initialized = True

    def apply_async(self, func, args=(), kwds={}, callback=None):
        if not self._initialized:
            raise RuntimeError("Pool not initialized")
        return super().apply_async(func, args, kwds, callback)

# 测试用例
def test_executor():
    with MyExecutor() as executor:
        future = executor.submit(lambda x: x**2, 10)
        print(future.result())

def test_pool():
    with MyPool(processes=4) as pool:
        result = pool.apply_async(lambda x: x**2, (10,))
        print(result.get())

test_executor()
test_pool()
```

在这个示例中,我们定义了两个子类 `MyExecutor` 和 `MyPool`,它们分别继承自 `ProcessPoolExecutor` 和 `Pool`。在初始化过程中,我们在这些子类的构造函数中添加了一个标志变量 `_initialized`,并在 `submit()` 和 `apply_async()` 方法中检查这个标志。如果标志没有被正确设置,我们就抛出一个 `RuntimeError`。

然而,当我们运行测试用例时,我们会看到以下错误:

```
Traceback (most recent call last):
  File "main.py", line 33, in <module>
    test_pool()
  File "main.py", line 28, in test_pool
    result = pool.apply_async(lambda x: x**2, (10,))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 434, in apply_async
    return AsyncResult(self._submit(fn, args, kwds))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 372, in _submit
    raise self._exception
RuntimeError: Pool not initialized
```

这是因为在 `MyExecutor` 和 `MyPool` 的构造函数中,我们没有正确地设置 `_initialized` 标志。我们应该确保在执行任何方法之前,我们已经初始化了这个标志。

为了解决这个问题,我们需要修改我们的子类构造函数,以确保它们正确地设置了 `_initialized` 标志。以下是修正后的示例代码:

```python
from concurrent.futures import ProcessPoolExecutor, Pool

class MyExecutor(ProcessPoolExecutor):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._initialized = True

    def submit(self, fn, *args, **kwargs):
        if not self._initialized:
            raise RuntimeError("Executor not initialized")
        return super().submit(fn, *args, **kwargs)

class MyPool(Pool):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._initialized = True

    def apply_async(self, func, args=(), kwds={}, callback=None):
        if not self._initialized:
            raise RuntimeError("Pool not initialized")
        return super().apply_async(func, args, kwds, callback)

# 测试用例
def test_executor():
    with MyExecutor() as executor:
        future = executor.submit(lambda x: x**2, 10)
        print(future.result())

def test_pool():
    with MyPool(processes=4) as pool:
        result = pool.apply_async(lambda x: x**2, (10,))
        print(result.get())

test_executor()
test_pool()
```

现在,测试用例应该能够正常运行,而不会抛出错误。python

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在MATLAB中进行池化操作,如果没有设置POOLSIZE参数,MATLAB会根据输入数据的大小自动选择一个默认的池化尺寸。这个默认的池化尺寸通常是2x2或3x3,根据池化类型(最大池化或平均池化)的不同而有所不同。因此,即使没有设置POOLSIZE参数,MATLAB仍然可以成功进行池化操作。不过,为了能够更好地控制池化操作的参数,建议在进行池化操作明确设置POOLSIZE参数。 ### 回答2: 在使用MATLAB进行池化操作,如果未设置POOLSIZE参数,仍然能够进行池化操作的原因如下: 1. 默认设置:MATLAB在执行池化操作,默认使用一些预定义的参数。其中包括POOLSIZE的默认设置为[2 2]。这意味着在进行池化操作,将以2x2的窗口大小对输入进行采样。 2. 自动调整:如果未显式设置POOLSIZE参数,MATLAB会根据输入数据自动调整窗口大小。它会根据输入数据的大小和维度,自动选择合适的采样窗口大小进行池化操作。这种自动调整能够保证输出结果的合理性和正确性。 3. 逐步池化:如果输入数据的大小不适合进行池化操作,MATLAB会将输入数据逐步按照一定规则分割成多个小块,并对这些小块分别进行池化操作。然后将这些小块的池化结果进行合并,得到最终的池化结果。 总之,即使没有显式设置POOLSIZE参数,MATLAB能够通过默认设置、自动调整和逐步池化等方式,保证能够进行有效的池化操作。但是根据具体需求,手动设置POOLSIZE参数仍然是更加灵活和精确的方法。 ### 回答3: MATLAB中的池化操作是通过pool函数实现的。当在调用pool函数没有显式设置POOSIZE参数,默认会使用一个大小为[2, 2]的池化窗口。池化窗口的大小决定了池化操作的区域大小。 池化操作主要用于降低特征图的空间维度,以减少计算量并提取更为显著的特征。在进行池化操作,通常会将一个区域内的特征值进行聚合,通常是求取该区域内特征值的最大值(最大池化)或平均值(平均池化)。 当在调用pool函数未显式设置POOLSIZE参数,默认的池化窗口大小为[2, 2]。这表示每次池化操作将会对一个2x2的区域内的特征值进行聚合。例如,假设原始特征图的大小为[4, 4],经过未显式设置POOLSIZE参数的默认池化操作后,输出的特征图的大小将会是[2, 2],即将原始特征图的大小缩小一半。 虽然可以在调用pool函数显式设置POOLSIZE参数来自定义池化窗口的大小,但是默认的大小[2, 2]已经适用于许多应用场景,并且在不明确指定POOLSIZE参数提供了一种便利的使用方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潮易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值