<p>如果没有aiohttp版本的错误,很难猜测。但乍一看,我想说:</p>
<ul>
<li>不需要显式地将事件循环传递给<code>ClientSession</code>,它将自动选择当前的事件循环,因此您只需调用<code>ClientSession()</code></li>
<li><code>fetch</code>函数不应<code>await resp</code>。<code>resp</code>不是一个协同程序。您可能想<code>return await resp.json()</code>(并删除<code>my_background_task</code>中多余的<code>.json()</code>)</li>
<li>在<code>my_method</code>中,您已经在一个协程中运行,如<code>async def</code>所示。因此,要调用另一个协同例程,您应该<code>await</code>-对其进行操作,而不是创建新的事件循环并在该新循环中运行它。在</li>
<li>在<code>my_background_task</code>中,您正在等待一个没有任何意义的东西:检查操作符await的优先级,您在一个协程中调用<code>.__getitem__</code>,然后等待{<cd14>}的结果,这与您想要的结果相反。在</li>
<li>仍然在这一行中,您不能在响应关闭后尝试读取响应的json主体(一旦退出<code>async with</code>,即只要<code>fetch</code>方法完成,响应就会关闭)。在</li>
<li>最后,不应该在每个循环中都重新创建ClientSession。它的存在使得它可以在请求之间共享,所以您应该在<code>my_background_task</code>中创建一次并使用它</li>
</ul>
<p>-</p>
<pre><code>async def fetch(session, url):
async with session.get(url) as resp:
print(resp.status)
return await resp.json()
async def my_background_task()
print("starting BG task")
await client.wait_until_ready()
async with aiohttp.ClientSession() as session:
while not client.is_closed:
data = await fetch(session, "www.theinternet.com/restcall")
element = data["dict_element"]
</code></pre>