- OSError: [WinError 121] Превышен таймаут семафора?
- Как устранить ошибку «Превышен таймаут семафора» на примере программирования на Python
- Семафоры
- Семафоры в Python
- Ошибка «Превышен таймаут семафора»
- Исправление ошибки
- Выводы
- Saved searches
- Use saved searches to filter your results more quickly
- aiohttp.client_exceptions.ClientOSError: [WinError 121] Превышен таймаут семафора #32
- aiohttp.client_exceptions.ClientOSError: [WinError 121] Превышен таймаут семафора #32
- Comments
- Saved searches
- Use saved searches to filter your results more quickly
- [WinError 121] The semaphore timeout period has expired #40
- [WinError 121] The semaphore timeout period has expired #40
- Comments
OSError: [WinError 121] Превышен таймаут семафора?
Первый раз столкнулся и удивился что в интернете нет никакой информации по этому поводу. Может кто знает как это исправить?
Traceback (most recent call last): File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\connector.py", line 969, in _wrap_create_connection return await self._loop.create_connection(*args, **kwargs) # type: ignore # noqa File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 1056, in create_connection raise exceptions[0] File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 1041, in create_connection sock = await self._connect_sock( File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 955, in _connect_sock await self.sock_connect(sock, address) File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 702, in sock_connect return await self._proactor.connect(sock, address) File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\windows_events.py", line 812, in _poll value = callback(transferred, key, ov) File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\windows_events.py", line 599, in finish_connect ov.getresult() OSError: [WinError 121] Превышен таймаут семафора The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\Admin\Desktop\Binance\main.py", line 100, in while True: File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 642, in run_until_complete return future.result() File "C:\Users\Admin\Desktop\Binance\main.py", line 89, in main File "C:\Users\Admin\Desktop\Binance\main.py", line 65, in fetch_spot return '' File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\client.py", line 1117, in __aenter__ self._resp = await self._coro File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\client.py", line 520, in _request conn = await self._connector.connect( File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\connector.py", line 535, in connect proto = await self._create_connection(req, traces, timeout) File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\connector.py", line 892, in _create_connection _, proto = await self._create_direct_connection(req, traces, timeout) File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\connector.py", line 1051, in _create_direct_connection raise last_exc File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\connector.py", line 1020, in _create_direct_connection transp, proto = await self._wrap_create_connection( File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\site-packages\aiohttp\connector.py", line 975, in _wrap_create_connection raise client_error(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host api.binance.com:443 ssl:default [Превышен таймаут семафора]
В прлошлый раз было на этой строчке:
async with s.get(f») as r:
import aiohttp import asyncio import httplib2 import apiclient.discovery import json from time import sleep from oauth2client.service_account import ServiceAccountCredentials from time import perf_counter def write_to_google_sheet(p2p, spot): CREDENTIALS_FILE = 'creds.json' spreadsheet_id = '1OBerxf9dfIdMGh0C3M8KsW_Mnhd-NM8B0-BD-Hxy2dI' credentials = ServiceAccountCredentials.from_json_keyfile_name( CREDENTIALS_FILE, 'https://www.googleapis.com/auth/spreadsheets') httpAuth = credentials.authorize(httplib2.Http()) service = apiclient.discovery.build('sheets', 'v4', httpAuth) service.spreadsheets().values().batchUpdate( spreadsheetId=spreadsheet_id, body=< 'valueInputOption': 'USER_ENTERED', 'data': [ , , , , , ] > ).execute() async def fetch_p2p(s, url, data): async with s.post(url, json=data) as r: body = json.loads(await r.read()) return body['data'][0]['adv']['price'] async def fetch_spot(s, url, symbol): if not symbol: return '' async with s.get(f'') as r: body = json.loads(await r.read()) return float(body['bidPrice']), float(body['askPrice']) async def main(): p2p_url = 'https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search' spot_url = 'https://api.binance.com/api/v1/ticker/bookTicker?symbol=' with open('patterns_p2p.json', encoding='utf-8') as f: patterns_p2p = json.loads(f.read()) with open('patterns_spot.txt', encoding='utf-8') as f: patterns_spot = [pattern for pattern in f.read().split('\n')] async with aiohttp.ClientSession() as s: tasks = [] for i in range(28): task = asyncio.ensure_future(fetch_p2p(s, p2p_url, patterns_p2p[i])) tasks.append(task) p2p = await asyncio.gather(*tasks) tasks = [] for i in range(32): task = asyncio.ensure_future(fetch_spot(s, spot_url, patterns_spot[i])) tasks.append(task) spot = await asyncio.gather(*tasks) tasks = [] for i in range(32, 63): task = asyncio.ensure_future(fetch_spot(s, spot_url, patterns_spot[i])) tasks.append(task) spot2 = await asyncio.gather(*tasks) for answer in spot2: spot.append(answer) spot = [el[0] if el else '' for el in spot] + [el[1] if el else '' for el in spot] return p2p, spot loop = asyncio.get_event_loop() while True: perfs = perf_counter() try: p2p, spot = loop.run_until_complete(main()) write_to_google_sheet(p2p, spot) except OSError as e: if e.errno == 121: pass if 10 - perf_counter() + perfs > 0: sleep(10 - perf_counter() + perfs)
Простой 6 комментариев
Как устранить ошибку «Превышен таймаут семафора» на примере программирования на Python
Одной из наиболее распространенных ошибок, с которой могут столкнуться разработчики при работе с многопоточностью в Python, является ошибка «Превышен таймаут семафора» (Semaphore Timeout Error). В данной статье мы рассмотрим, что такое семафоры, как они работают в Python, как возникает ошибка, и как ее можно исправить.
Семафоры
Семафоры — это классический механизм синхронизации потоков, который используется для решения проблемы доступа к общим ресурсам несколькими потоками. Семафор — это объект, который имеет определенное количество «разрешений» на доступ к общему ресурсу. Когда поток хочет получить доступ к ресурсу, он запрашивает у семафора разрешение. Если разрешение доступно, семафор выдает его, и поток может продолжить работу с общим ресурсом. Если разрешение недоступно, поток будет ждать, пока не освободится одно из разрешений.
Семафоры в Python
В Python семафоры реализуются встроенным модулем threading . Для создания семафора необходимо вызвать функцию Semaphore() и передать ей количество разрешений, которыми будет обладать созданный объект.
import threading semaphore = threading.Semaphore(5) # создание семафора с 5-ю разрешениями
Для получения доступа к ресурсу поток должен вызвать у семафора метод acquire() . Если в момент вызова у семафора нет свободных разрешений, поток будет заблокирован до тех пор, пока одно из разрешений не будет освобождено. После того, как поток закончил работу с ресурсом, он должен вызвать у семафора метод release() , чтобы освободить одно из разрешений.
semaphore.acquire() # запрос доступа к ресурсу # работа с общим ресурсом semaphore.release() # освобождение разрешения
Ошибка «Превышен таймаут семафора»
Ошибка «Превышен таймаут семафора» возникает, когда поток не может получить доступ к ресурсу в течение определенного времени. Обычно это происходит при отсутствии корректной синхронизации между несколькими потоками.
Исправление ошибки
Существует несколько способов исправления ошибки «Превышен таймаут семафора». Один из наиболее распространенных — увеличение количества разрешений у семафора. Также можно увеличить время ожидания доступа к ресурсу, вызвав метод acquire() с параметром timeout .
semaphore.acquire(timeout=10) # запрос доступа к ресурсу с ожиданием до 10 секунд
Если эти методы не помогают, необходимо внимательно проверить код программы на наличие ошибок синхронизации и убедиться, что все потоки работают корректно и не блокируют друг друга.
Выводы
Семафоры — это важный механизм синхронизации потоков, который позволяет избежать проблем доступа к общим ресурсам в многопоточных программах. Ошибка «Превышен таймаут семафора» является одной из наиболее распространенных при использовании семафоров в Python, но ее можно легко исправить, следуя описанным выше методам. Важно убедиться, что код программы корректно синхронизирует потоки, чтобы избежать появления ошибок в работе программы.
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
aiohttp.client_exceptions.ClientOSError: [WinError 121] Превышен таймаут семафора #32
aiohttp.client_exceptions.ClientOSError: [WinError 121] Превышен таймаут семафора #32
Comments
aiohttp.client_exceptions.ClientOSError: [WinError 121] Превышен таймаут семафора
Я погуглил и ничего не нашел по этому поводу, есть ли какой то фикс? (Ошибка возникает после решение капчи)
@c.event(«on_captcha»)
async def on_captcha(captcha_data):
# captcha_data contains captcha_sitekey, captcha_service (hcaptcha), captcha_rqdata and captcha_rqtoken
print(f»Captcha!»)
solver = hCaptchaProxyless()
solver.set_verbose(1)
solver.set_key(«3ae39105dbb97c5c01522b940547b2b6») # Ваш ключ
solver.set_website_url(«https://discord.com/login»)
solver.set_website_key(captcha_data[‘captcha_sitekey’])
solver.set_user_agent(«Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36»)
solver.set_is_invisible(1)
solver.set_enterprise_payload()
result = solver.solve_and_return_solution()
g_response = solver.solve_and_return_solution()
if g_response != 0:
print(«g-response: «+g_response)
print(«user-agent: «+solver.get_user_agent())
The text was updated successfully, but these errors were encountered:
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WinError 121] The semaphore timeout period has expired #40
[WinError 121] The semaphore timeout period has expired #40
Comments
Such errors often appear in the output. However, this doesn’t seem to affect the quality of the connection.
Windows 10 Build 17692, Python 3.7.0
Fatal read error on pipe transport protocol: transport: Traceback (most recent call last): File "C:\. \Python37\lib\asyncio\proactor_events.py", line 255, in _loop_reading data = fut.result() File "C:\. \Python37\lib\asyncio\windows_events.py", line 732, in _poll value = callback(transferred, key, ov) File "C:\. \Python37\lib\asyncio\windows_events.py", line 428, in finish_recv return ov.getresult() OSError: [WinError 121] The semaphore timeout period has expired
The text was updated successfully, but these errors were encountered: