実行中のイベントループから asyncio.run() を呼び出すことができない
2023-09-10 23:22:10
質問
asyncioを使ってWebページのhtmlを取得したいです。
jupyter notebookで以下のコードを実行しました。
import aiofiles
import aiohttp
from aiohttp import ClientSession
async def get_info(url, session):
resp = await session.request(method="GET", url=url)
resp.raise_for_status()
html = await resp.text(encoding='GB18030')
with open('test_asyncio.html', 'w', encoding='utf-8-sig') as f:
f.write(html)
return html
async def main(urls):
async with ClientSession() as session:
tasks = [get_info(url, session) for url in urls]
return await asyncio.gather(*tasks)
if __name__ == "__main__":
url = ['http://huanyuntianxiazh.fang.com/house/1010123799/housedetail.htm', 'http://zhaoshangyonghefu010.fang.com/house/1010126863/housedetail.htm']
result = asyncio.run(main(url))
しかし、これは
RuntimeError: asyncio.run() cannot be called from a running event loop
何が問題なのでしょうか?
どうすれば解決できるのか?
どのように解決するのですか?
この
asyncio.run()
のドキュメントにはこうあります。
この関数 は は、同じスレッドで別のasyncioイベントループが実行されているときは呼び出されません。
あなたの場合、jupyter ( IPython ≥ 7.0 ) はすでにイベントループを実行しています。
これでIPythonのターミナルやノートブックのトップレベルでasync/awaitが使えるようになり、ほとんどの場合 - "just work "になるはずです。IPython をバージョン 7+ に、IPykernel をバージョン 5+ に更新すれば、レースへの出発です。
したがって、イベントループを自分で開始する必要はなく、代わりに
await main(url)
を直接呼び出すことができます。
Jupyter / IPython
async def main():
print(1)
await main()
Python (≥ 3.7)
import asyncio
async def main():
print(1)
asyncio.run(main())
あなたのコードでは、それは与えるでしょう。
url = ['url1', 'url2']
result = await main(url)
for text in result:
pass # text contains your html (text) response
注意事項
関連
-
[解決済み] 辞書から要素を削除する
-
[解決済み] Pythonです。私はどのOSで動いているのでしょうか?
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Django filter queryset __in for *every* item in list