From ebc522150eca6d458eb54d24594f71e28e91360a Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Mon, 1 Jan 2024 02:09:06 +0100 Subject: Patch event loop on win, Check event loop closed --- g4f/Provider/base_provider.py | 7 +++++++ g4f/Provider/helper.py | 38 +++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/g4f/Provider/base_provider.py b/g4f/Provider/base_provider.py index f3959634..62029f5d 100644 --- a/g4f/Provider/base_provider.py +++ b/g4f/Provider/base_provider.py @@ -13,6 +13,13 @@ if sys.version_info < (3, 10): else: from types import NoneType +# Change event loop policy on windows for curl_cffi +if sys.platform == 'win32': + if isinstance( + asyncio.get_event_loop_policy(), asyncio.WindowsProactorEventLoopPolicy + ): + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + class BaseProvider(ABC): url: str working: bool = False diff --git a/g4f/Provider/helper.py b/g4f/Provider/helper.py index 61d9cb62..ded59ee2 100644 --- a/g4f/Provider/helper.py +++ b/g4f/Provider/helper.py @@ -7,9 +7,9 @@ import random import string import secrets import os -from os import path -from asyncio import AbstractEventLoop -from platformdirs import user_config_dir +from os import path +from asyncio import AbstractEventLoop +from platformdirs import user_config_dir from browser_cookie3 import ( chrome, chromium, @@ -25,37 +25,33 @@ from browser_cookie3 import ( from ..typing import Dict, Messages from .. import debug -# Change event loop policy on windows -if sys.platform == 'win32': - if isinstance( - asyncio.get_event_loop_policy(), asyncio.WindowsProactorEventLoopPolicy - ): - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) - # Local Cookie Storage _cookies: Dict[str, Dict[str, str]] = {} -# If event loop is already running, handle nested event loops +# If loop closed or not set, create new event loop. +# If event loop is already running, handle nested event loops. # If "nest_asyncio" is installed, patch the event loop. def get_event_loop() -> AbstractEventLoop: try: - asyncio.get_running_loop() + loop = asyncio.get_event_loop() + loop._check_closed() except RuntimeError: - try: - return asyncio.get_event_loop() - except RuntimeError: - asyncio.set_event_loop(asyncio.new_event_loop()) - return asyncio.get_event_loop() + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) try: - event_loop = asyncio.get_event_loop() - if not hasattr(event_loop.__class__, "_nest_patched"): + # Is running event loop + asyncio.get_running_loop() + if not hasattr(loop.__class__, "_nest_patched"): import nest_asyncio - nest_asyncio.apply(event_loop) - return event_loop + nest_asyncio.apply(loop) + except RuntimeError: + # No running event loop + pass except ImportError: raise RuntimeError( 'Use "create_async" instead of "create" function in a running event loop. Or install the "nest_asyncio" package.' ) + return loop def init_cookies(): urls = [ -- cgit v1.2.3