因此,我设法使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调用的函数。
答案 0 :(得分:1)
问题出在调用run_in_executor
:
futures = [
loop.run_in_executor(
executor,
searching(queries)
)
]
run_in_executor
接受要执行的功能。该代码未将其传递给函数,而是调用一个函数searching
,并传递run_in_executor
该调用的返回值。这有两个后果:
该代码无法按预期运行-它一个接一个地调用搜索,而不是并行进行;
它显示错误消息,提示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大量代码。