Python:Concurrent.Futures错误[TypeError:'NoneType'对象不可调用]

时间:2018-06-25 00:16:44

标签: python typeerror python-asyncio nonetype

因此,我设法使asyncio / Google CSE API可以一起工作。...当我在PyCharm上运行代码时,可以打印出结果。但是,在打印内容的最后是错误“ TypeError:'NoneType'对象不可调用”。

我怀疑这与我的列表有关,也许循环试图搜索另一个术语,即使我位于列表的末尾...

也..这是我的第一个问题帖子,请随时就如何更好地提出问题提供建议

有想法吗?

@Provides
@Singleton
@Named(MAGNETOMETER)
public Observable<SimpleMatrix> magnetometer(final SensorManager sensorManager) {
    final PublishSubject<SimpleMatrix> ps = PublishSubject.create();
    final Sensor sensor = sensorManager.getDefaultSensor(TYPE_MAGNETIC_FIELD);
    final SensorEventListener listener = new SensorEventAdapter() {
        @Override
        public void onSensorChanged(final SensorEvent event) {
            ps.onNext(new SimpleMatrix(1, 3, true, event.values));
        }
    };
    return ps.doOnSubscribe(s -> {
        sensorManager.registerListener(listener, sensor, SENSOR_DELAY_NORMAL);
    }).doOnDispose(() -> {
        sensorManager.unregisterListener(listener);
    }).share();
}

我的错误可以追溯到“等待asyncio.gather(* futures)中的响应:”

供您参考,search(queries)只是我的Google CSE API调用的函数。

1 个答案:

答案 0 :(得分:1)

问题出在调用run_in_executor

    futures = [
        loop.run_in_executor(
            executor,
            searching(queries)
        )
    ]

run_in_executor接受要执行的功能。该代码未将其传递给函数,而是调用一个函数searching,并传递run_in_executor该调用的返回值。这有两个后果:

  1. 该代码无法按预期运行-它一个接一个地调用搜索,而不是并行进行;

  2. 它显示错误消息,提示run_in_executor尝试调用None的{​​{1}}返回值。令人困惑的是,该错误仅在稍后等待searching(...)返回的期货时才出现,到那时所有搜索实际上已经完成。

调用run_in_executor的正确方法如下:

run_in_executor

请注意,现在仅提到而不是使用使用 futures = [ loop.run_in_executor(executor, searching, queries) ] 函数。

此外,如果仅使用asyncio来调用searching中的同步调用,那么使用它并不会真正受益。使用run_in_executor中基于线程的工具可以直接获得相同的效果,而无需将整个程序调整为异步。 concurrent.futures可以少量使用,既可以偶尔与不提供异步前端的旧版API进行接口,也可以用于无法大量转换为协程的CPU大量代码。