首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >你有没有得到过RuntimeError:“等待”并没有被用于未来?

你有没有得到过RuntimeError:“等待”并没有被用于未来?
EN

Stack Overflow用户
提问于 2021-07-28 16:04:50
回答 2查看 528关注 0票数 0

尝试使用异步和aiohttp从网站中提取数据,等待在for循环函数中出现问题。

这里我的剧本:

代码语言:javascript
运行
复制
async def get_page(session,x):
    async with session.get(f'https://disclosure.bursamalaysia.com/FileAccess/viewHtml?e={x}') as r:
        return await r.text()
    
async def get_all(session, urls):
    tasks =[]
    sem = asyncio.Semaphore(1)
    count = 0
    for x in urls:
        count +=1
        task = asyncio.create_task(get_page(session,x))
        tasks.append(task)
        print(count,'-ID-',x,'|', end=' ')
    results = await asyncio.gather(*task)
    return results

async def main(urls):
    async with aiohttp.ClientSession() as session:
        data = await get_all(session, urls)
        return
        
if __name__ == '__main__':
    urls = titlelink
    results = asyncio.run(main(urls))
    print(results)

对于此错误,当刮板断裂时,它返回的内容如下:

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-3-5ac99108678c> in <module>
     22 if __name__ == '__main__':
     23     urls = titlelink
---> 24     results = asyncio.run(main(urls))
     25     print(results)

~\AppData\Local\Programs\Python\Python38\lib\site-packages\nest_asyncio.py in run(future, debug)
     30         loop = asyncio.get_event_loop()
     31         loop.set_debug(debug)
---> 32         return loop.run_until_complete(future)
     33 
     34     if sys.version_info >= (3, 6, 0):

~\AppData\Local\Programs\Python\Python38\lib\site-packages\nest_asyncio.py in run_until_complete(self, future)
     68                 raise RuntimeError(
     69                     'Event loop stopped before Future completed.')
---> 70             return f.result()
     71 
     72     def _run_once(self):

~\AppData\Local\Programs\Python\Python38\lib\asyncio\futures.py in result(self)
    176         self.__log_traceback = False
    177         if self._exception is not None:
--> 178             raise self._exception
    179         return self._result
    180 

~\AppData\Local\Programs\Python\Python38\lib\asyncio\tasks.py in __step(***failed resolving arguments***)
    278                 # We use the `send` method directly, because coroutines
    279                 # don't have `__iter__` and `__next__` methods.
--> 280                 result = coro.send(None)
    281             else:
    282                 result = coro.throw(exc)

<ipython-input-3-5ac99108678c> in main(urls)
     17 async def main(urls):
     18     async with aiohttp.ClientSession() as session:
---> 19         data = await get_all(session, urls)
     20         return
     21 

<ipython-input-3-5ac99108678c> in get_all(session, urls)
     12         tasks.append(task)
     13         print(count,'-ID-',x,'|', end=' ')
---> 14     results = await asyncio.gather(*task)
     15     return results
     16 

~\AppData\Local\Programs\Python\Python38\lib\asyncio\futures.py in __await__(self)
    260             yield self  # This tells Task to wait for completion.
    261         if not self.done():
--> 262             raise RuntimeError("await wasn't used with future")
    263         return self.result()  # May raise too.
    264 

RuntimeError: await wasn't used with future

这个错误是因为在for循环函数中放置等待,还是因为服务器问题?或者我写剧本的方式是错的。感谢你们中有谁能指点我或引导我走向正确的方向

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-28 16:28:07

您可以使用multiprocessing同时刮多个链接(并行):

代码语言:javascript
运行
复制
from multiprocessing import Pool
    
def scrape(url):
    #Scraper script

p = Pool(10)
# This “10” means that 10 URLs will be processed at the same time.
p.map(scrape, list_of_all_urls)
p.terminate()
p.join()

这里,我们用list_of_all_urls映射函数,Pool p将负责执行每个函数,concurrently.This类似于simple.py中的list_of_all_urls循环,但这里是并发执行的。如果URL的数量为100,并且我们指定了Pool( 20 ),那么它将进行5次迭代(100/20),20个URL将在一次执行中被处理。

需要注意的两件事

  1. 链接不是按顺序执行的。您可以看到订单是2,1,3…这是由于多进程和时间节省了一个进程,而不是等待上一个进程完成。这被称为并行执行。
  2. 这个刮得很快,比正常的还要快。当URL数量增加时,这种差异会迅速增长,这意味着随着URL数量的增加,多处理脚本的性能也会提高。

您可以访问这里获取更多/详细信息。

我相信这和前面的问题是一样的,我认为你可以使用multiprocessing。我知道这不是正确的答案,但您可以使用多进程,这是容易的,直接的。

票数 0
EN

Stack Overflow用户

发布于 2022-12-04 16:04:32

await asyncio.gather(*task)

应:

await asyncio.gather(*tasks)

异常实际上来自*task。不确定这个语法的意义是什么,但这肯定不是您想要的:

代码语言:javascript
运行
复制
>>> t = asyncio.Task(asyncio.sleep(10))
>>> (*t,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: await wasn't used with future
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68563801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档