pyzmq - zmq_req можно ли иметь один контекст и использовать несколько сокетов?

В настоящее время я работаю над проектом Benchmark, где пытаюсь нагрузить сервер запросами zmq.

Мне было интересно, как лучше всего подойти к этому, я думал о том, чтобы иметь контекст для создания сокета и вставлять его в поток, в котором я буду отправлять запрос и ждать ответов в каждом потоке соответственно, но я не слишком уверен, что это возможно с ограничениями Python.

Более того, будет ли это один и тот же сокет для всех потоков, то есть, если я жду ответа в одном потоке (со своим собственным сокетом), сможет ли другой поток перехватить этот ответ?

Спасибо.

РЕДАКТИРОВАТЬ: Логика прохождения теста будет такой:

Клиентский сокет будет использовать zmq.REQ. Клиент отправляет сообщение. Клиент ждет ответа. Если нет ответа, клиент повторно подключается и пытается снова, пока не будет достигнуто ограничение.

Я хотел бы масштабировать эту операцию до любого количества клиентов, предпочитая не иметь дело с процессами, если с точки зрения производительности разница не значительна.

Как бы вы это сделали?


person grishatsu    schedule 28.06.2020    source источник


Ответы (1)


Вопрос : ...можно ли иметь один контекст и использовать несколько сокетов?

О, конечно, вы можете.

Более того, у вас может быть несколько Context()-экземпляров, каждый из которых управляет ... почти... любым количеством Socket()-экземпляров, методы каждого Socket()-экземпляра могут вызываться из один и только один поток python (правило Zen-of-Zero: zero-sharing).

Из-за известной ре-[SERIAL]-блокировки GIL-блокировки всего потока выполнения кода на основе потоков это все еще должно и будет ждать получения права собственности на GIL-блокировку, что, в свою очередь, разрешает GIL-блокировку. -lock владелец (и никто другой) для выполнения фиксированного количества инструкций Python, прежде чем он повторно освободит GIL-блокировку для какого-либо другого потока...

person user3666197    schedule 28.06.2020
comment
Спасибо за быстрый ответ. Итак, было бы разумно, если бы я открыл 10 тыс. сокетов в одном и том же потоке и просмотрел их, чтобы каждый отправил сообщение, а затем дождался ответа? Или с другой стороны — я могу открыть для каждого воркера процесс, отправить ему сокет, а его работа будет заключаться в том, чтобы отправить сообщение и дождаться ответа. (10к из них). - person grishatsu; 29.06.2020
comment
Это довольно сильно зависит от того, что вы собираетесь тестировать. Масштабирование — сильная функция набора инструментов ZeroMQ. Ограничения Python остаются. GIL-lock – это известная уловка повторного использования [SERIAL], позволяющая принципиально избежать любого вида-или-формы [CONCURRENT] -поток выполнения кода. Таким образом, ZeroMQ определенно не блокирует продвижение в этом направлении. - person user3666197; 29.06.2020
comment
Спасибо за ответы. Я некоторое время задерживался с этим - всегда находил новый предел для моего клиента и, похоже, не мог открыть новые сокеты. Я пробовал несколько контекстов в разных процессах, а также пытался установить ограничение max_socket для этих контекстов. Это привело меня к примерно 8000 ~ сокетам для приложения. Теперь я знаю, что мы можем добиться большего, но я просто не уверен, как это сделать. Какие-нибудь мысли? - person grishatsu; 14.07.2020
comment
Я рад, что мой ответ и дополнительные комментарии помогли вам. Не стесняйтесь проголосовать и принять лучший ответ, который вы получили на данный момент. Задавать больше вопросов — это лучший способ двигаться дальше и отвечать на все новые и новые вопросы, с которыми вы можете столкнуться. StackOverflow всегда работал таким образом и, надеюсь, останется таковым в ближайшие годы. - person user3666197; 14.07.2020