сон неблокирующих вызовов

Я ищу оптимальное значение сна для получения данных из неблокирующего сокета. Например:

while True:
    data=s.recv(1024)
    if not data:
        time.sleep(10) #10ms
    else:
        pass #...

Отсутствие сна привело бы к 100%-му использованию ЦП, так что есть идеи, как получить наилучшую загрузку ЦП и пропускную способность? Как долго должен быть сон, чтобы процессор мог переключать потоки?

Кстати, есть ли смысл через SO_SNDBUF/SO_RECVBUF задавать буфер сокета и задавать TCP_NODELAY или их не стоит совмещать?


person Mister X    schedule 13.09.2011    source источник
comment
Разучи шаблон. Сейчас! Забудьте, что функция sleep() когда-либо существовала. Для каждого использования sleep() есть другой, более подходящий метод.   -  person Jan Hudec    schedule 13.09.2011


Ответы (3)


Вы не должны делать это сами. Используйте вызов select с тайм-аутом, если вам нужно, чтобы ваш код периодически просыпался. даже если данные не были получены.

Кстати, TCP_NODELAY относится к отправляющей стороне и не повлияет на ваши reads.

person Mat    schedule 13.09.2011
comment
В моем случае сокет переключает вызовы чтения/записи. принять/отправить/отправить/отправить/получить/получить/... - person Mister X; 13.09.2011

Если вы планируете использовать sleep(), почему бы вам просто не использовать блокирующие сокеты?

person Simone    schedule 13.09.2011

Используйте select. Это в основном приостановит программу и разбудит ее, когда в сокете появятся данные.

person Arnaud Le Blanc    schedule 13.09.2011
comment
Я думал, что когда я использую select(...), данные могут исчезнуть в неблокирующем сокете, когда я вернусь и попытаюсь их получить. - person Mister X; 13.09.2011
comment
@ Мистер Нет. Откуда у тебя эта идея? Вы не можете потерять данные через какой-либо API в TCP/IP, если только вы не допускаете ошибки программирования. - person user207421; 13.09.2011