Python:Concurrent.Futures 错误 [TypeError:'NoneType' 对象不可调用]
Posted
技术标签:
【中文标题】Python:Concurrent.Futures 错误 [TypeError:\'NoneType\' 对象不可调用]【英文标题】:Python: Concurrent.Futures Error [TypeError: 'NoneType' object is not callable]Python:Concurrent.Futures 错误 [TypeError:'NoneType' 对象不可调用] 【发布时间】:2018-12-03 12:37:53 【问题描述】:所以我设法让 asyncio / Google CSE API 一起工作......当我在 PyCharm 上运行我的代码时,我能够打印出我的结果。但是,在打印内容的最后是错误“TypeError: 'NoneType' object is not callable”。
我怀疑这与我的列表有关,也许循环试图搜索另一个词,即使我在列表的末尾...
另外..这是我的第一个问题帖子,因此请随时提供有关如何更好地提问的建议
想法?
searchterms = ['cheese',
'hippos',
'whales',
'beluga']
async def sendQueries(queries, deposit=list()):
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(
executor,
searching(queries)
)
]
for response in await asyncio.gather(*futures):
deposit.append(response.json())
return deposit
def running():
loop = asyncio.get_event_loop()
loop.run_until_complete(loop.create_task(sendQueries(searchterms)))
loop.close()
print(running())
print(str(time.time() - x))
我的错误可以追溯到“for response in await asyncio.gather(*futures):”
供您参考,搜索(查询)只是我的 Google CSE API 调用的函数。
【问题讨论】:
无关:您应该阅读mutable default arguments。您可能会遇到deposit
的问题。
【参考方案1】:
问题在于对run_in_executor
的调用:
futures = [
loop.run_in_executor(
executor,
searching(queries)
)
]
run_in_executor
接受要执行的函数。代码没有将函数传递给它,它调用函数searching
,并传递run_in_executor
该调用的返回值。这有两个后果:
代码无法按预期工作 - 它一个接一个地调用搜索,而不是并行调用;
它显示一个错误,抱怨run_in_executor
尝试调用None
返回值searching(...)
。令人困惑的是,该错误只是在等待 run_in_executor
返回的期货时才出现,此时所有搜索实际上都已完成。
调用run_in_executor
的正确方法是:
futures = [
loop.run_in_executor(executor, searching, queries)
]
注意searching
函数现在只是提及而不是使用。
此外,如果您仅使用 asyncio 来调用 run_in_executor
中的同步调用,那么您并没有真正从它的使用中受益。您可以直接使用来自concurrent.futures
的基于线程的工具获得相同的效果,但无需将整个程序调整为 asyncio。 run_in_executor
应谨慎使用,既可用于偶尔与不提供异步前端的旧版 API 交互,也可用于无法有意义地转换为协程的 CPU 密集型代码。
【讨论】:
好的。感谢帮助。它现在肯定工作得更快。我在 1.1 秒内获得了大约 12 个搜索实例,而不是之前的 5 个。我认为之前那个时候有些东西是粗略的.....以上是关于Python:Concurrent.Futures 错误 [TypeError:'NoneType' 对象不可调用]的主要内容,如果未能解决你的问题,请参考以下文章
python的multiprocessing和concurrent.futures有啥区别?
Python:Concurrent.Futures 错误 [TypeError:'NoneType' 对象不可调用]