第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何確保僅存在一個特定類型的協(xié)程

如何確保僅存在一個特定類型的協(xié)程

犯罪嫌疑人X 2023-08-15 18:54:17
在我的課堂上,我有一個獲取網(wǎng)站的方法(如下所示)。我注意到使用此方法的其他方法可能會導致向一個站點打開多個請求(當一個請求待處理時 self._page 仍然沒有)。我怎樣才能避免它?我的意思是,當有另一個對 _get_page 的調(diào)用但有一個正在等待時,只需從第一個調(diào)用返回一個 future 并且不要重復頁面請求async def _get_page(self) -> HtmlElement:        if self._page is None:            async with self._get_session().get(self._url) as page:                self._page = lxml.html.document_fromstring(await page.text())        return self._page
查看完整描述

2 回答

?
一只甜甜圈

TA貢獻1836條經(jīng)驗 獲得超5個贊

如何避免[多次請求]?

你可以使用asyncio.Lock

saync def __init__(self, ...):

? ? ...

? ? self._page_lock = asyncio.Lock()


async def _get_page(self) -> HtmlElement:

? ? async with self._page_lock:

? ? ? ? if self._page is None:

? ? ? ? ? ? async with self._get_session().get(self._url) as page:

? ? ? ? ? ? ? ? self._page = lxml.html.document_fromstring(await page.text())

? ? return self._page


查看完整回答
反對 回復 2023-08-15
?
撒科打諢

TA貢獻1934條經(jīng)驗 獲得超2個贊

Python 3.8 和 jupyter 筆記本的更新


import asyncio

import aiohttp

from lxml import html



class MyClass:

? ? def __init__(self):

? ? ? ? self._url = 'https://www.google.com'

? ? ? ? self._page = None

? ? ? ? self._futures = []

? ? ? ? self._working = False

? ? ? ? self._session = aiohttp.ClientSession()



? ? async def _close(self):

? ? ? ? if self._session:

? ? ? ? ? ? session = self._session

? ? ? ? ? ? self._session = None

? ? ? ? ? ? await session.close()


? ? def _get_session(self):

? ? ? ? return self._session


? ? async def _get_page(self):

? ? ? ? if self._page is None:

? ? ? ? ? ? if self._working:

? ? ? ? ? ? ? ? print('will await current page request')

? ? ? ? ? ? ? ? loop = asyncio.get_event_loop()

? ? ? ? ? ? ? ? future = loop.create_future()

? ? ? ? ? ? ? ? self._futures.append(future)

? ? ? ? ? ? ? ? return await future

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? self._working = True

? ? ? ? ? ? session = self._get_session()

? ? ? ? ? ? print('making url request')

? ? ? ? ? ? async with session.get(self._url) as page:

? ? ? ? ? ? ? ? print('status =', page.status)

? ? ? ? ? ? ? ? print('making page request')

? ? ? ? ? ? ? ? self._page = html.document_fromstring(await page.text())

? ? ? ? ? ? ? ? print('Got page text')

? ? ? ? ? ? ? ? for future in self._futures:

? ? ? ? ? ? ? ? ? ? print('setting result to awaiting request')

? ? ? ? ? ? ? ? ? ? future.set_result(self._page)

? ? ? ? ? ? ? ? self._futures = []

? ? ? ? ? ? ? ? self._working = False

? ? ? ? return self._page



async def main():

? ? futures = []

? ? m = MyClass()

? ? futures.append(asyncio.ensure_future(m._get_page()))

? ? futures.append(asyncio.ensure_future(m._get_page()))

? ? futures.append(asyncio.ensure_future(m._get_page()))

? ? results = await asyncio.gather(*futures)

? ? for result in results:

? ? ? ? print(result[0:80])

? ? await m._close()



if __name__ == '__main__':

? ? asyncio.run(main())

? ? #await main() # In jupyter notebook and iPython

請注意,在 Windows 10 上,我在終止時看到:


RuntimeError: Event loop is closed


查看完整回答
反對 回復 2023-08-15
  • 2 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號