---------------------------------------------------------------------------
OperationalError Traceback (most recent call last)
Cell In[31], line 13
1 client = await clickhouse_connect.get_async_client(
2 host=config["host"],
3 username=config["username"],
(...)
8 send_receive_timeout=7200,
9 )
11 sleep_query = "SELECT sleep(3)"
---> 13 await asyncio.gather(*(query(i) for i in range(10)))
Cell In[30], line 3, in query(order)
1 async def query(order: int):
2 await asyncio.sleep(0.2 * order)
----> 3 return await client.query(sleep_query)
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\asyncclient.py:96, in AsyncClient.query(self, query, parameters, settings, query_formats, column_formats, encoding, use_none, column_oriented, use_numpy, max_str_len, context, query_tz, column_tzs, external_data)
89 return self.client.query(query=query, parameters=parameters, settings=settings, query_formats=query_formats,
90 column_formats=column_formats, encoding=encoding, use_none=use_none,
91 column_oriented=column_oriented, use_numpy=use_numpy, max_str_len=max_str_len,
92 context=context, query_tz=query_tz, column_tzs=column_tzs,
93 external_data=external_data)
95 loop = asyncio.get_running_loop()
---> 96 result = await loop.run_in_executor(self.executor, _query)
97 return result
File ~\miniforge3\envs\sample_size_calculator\Lib\concurrent\futures\thread.py:59, in _WorkItem.run(self)
56 return
58 try:
---> 59 result = self.fn(*self.args, **self.kwargs)
60 except BaseException as exc:
61 self.future.set_exception(exc)
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\asyncclient.py:89, in AsyncClient.query.._query()
88 def _query():
---> 89 return self.client.query(query=query, parameters=parameters, settings=settings, query_formats=query_formats,
90 column_formats=column_formats, encoding=encoding, use_none=use_none,
91 column_oriented=column_oriented, use_numpy=use_numpy, max_str_len=max_str_len,
92 context=context, query_tz=query_tz, column_tzs=column_tzs,
93 external_data=external_data)
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\client.py:222, in Client.query(self, query, parameters, settings, query_formats, column_formats, encoding, use_none, column_oriented, use_numpy, max_str_len, context, query_tz, column_tzs, external_data)
220 return response.as_query_result()
221 return QueryResult([response] if isinstance(response, list) else [[response]])
--> 222 return self._query_with_context(query_context)
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:229, in HttpClient._query_with_context(self, context)
227 fields = None
228 headers['Content-Type'] = 'text/plain; charset=utf-8'
--> 229 response = self._raw_request(body,
230 params,
231 headers,
232 stream=True,
233 retries=self.query_retries,
234 fields=fields,
235 server_wait=not context.streaming)
236 byte_source = RespBuffCls(ResponseSource(response)) # pylint: disable=not-callable
237 context.set_response_tz(self._check_tz_change(response.headers.get('X-ClickHouse-Timezone')))
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:457, in HttpClient._raw_request(self, data, params, headers, method, retries, stream, server_wait, fields, error_handler)
455 if response.status in (429, 503, 504):
456 if attempts > retries:
--> 457 self._error_handler(response, True)
458 logger.debug('Retrying requests with status code %d', response.status)
459 elif error_handler:
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:385, in HttpClient._error_handler(self, response, retried)
382 else:
383 err_str = 'The ClickHouse server returned an error.'
--> 385 raise OperationalError(err_str) if retried else DatabaseError(err_str) from None
OperationalError: HTTPDriver for https://ch..com:443 returned response code 429
Насколько мне известно, ошибка HTTP 429 означает «Слишком много запросов». Но как получить лимитные параметры явно через SELECT-запрос ClickHouse или каким-либо другим способом? Чтобы я мог настроить семафор asyncio на максимально допустимое число, чтобы избежать исключения.
await asyncio.gather(*(query(i) for i in range(n))) [/code] Пока n не превысит 6, все работает нормально. Но после этого я могу поймать следующее исключение: [code]--------------------------------------------------------------------------- OperationalError Traceback (most recent call last) Cell In[31], line 13 1 client = await clickhouse_connect.get_async_client( 2 host=config["host"], 3 username=config["username"], (...) 8 send_receive_timeout=7200, 9 ) 11 sleep_query = "SELECT sleep(3)" ---> 13 await asyncio.gather(*(query(i) for i in range(10)))
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:457, in HttpClient._raw_request(self, data, params, headers, method, retries, stream, server_wait, fields, error_handler) 455 if response.status in (429, 503, 504): 456 if attempts > retries: --> 457 self._error_handler(response, True) 458 logger.debug('Retrying requests with status code %d', response.status) 459 elif error_handler:
File ~\miniforge3\envs\sample_size_calculator\Lib\site-packages\clickhouse_connect\driver\httpclient.py:385, in HttpClient._error_handler(self, response, retried) 382 else: 383 err_str = 'The ClickHouse server returned an error.' --> 385 raise OperationalError(err_str) if retried else DatabaseError(err_str) from None
OperationalError: HTTPDriver for https://ch..com:443 returned response code 429 [/code] Насколько мне известно, ошибка HTTP 429 означает «Слишком много запросов». Но как получить лимитные параметры явно через SELECT-запрос ClickHouse или каким-либо другим способом? Чтобы я мог настроить семафор asyncio на максимально допустимое число, чтобы избежать исключения.
У меня есть сервер Centos 7, и когда я ограничиваю максимальное количество подключений на пользователя с помощью файла конфигурации /etc/security/limits.conf, все работает нормально. Ниже приведен пример моей конфигурации в этом файле:
Вопрос
Как управлять одновременными веб-запросами с ограничением скорости к нескольким доменам, используя только stdlib Python? Я не спрашиваю об алгоритмах, таких как дырявое ведро или решения для одного домена, а о том, как подходить к структурам...
Вопрос
Как управлять одновременными веб-запросами с ограничением скорости к нескольким доменам, используя только stdlib Python? Я не спрашиваю об алгоритмах, таких как дырявое ведро или решения для одного домена, а о том, как подходить к структурам...
Вопрос
Как управлять одновременными веб-запросами с ограничением скорости к нескольким доменам, используя только stdlib Python? Я не спрашиваю об алгоритмах, таких как дырявое ведро или решения для одного домена, а о том, как подходить к структурам...
Вопрос
Как управлять одновременными веб-запросами с ограничением скорости к нескольким доменам, используя только stdlib Python? Я не спрашиваю об алгоритмах, таких как дырявое ведро или решения для одного домена, а о том, как подходить к структурам...