Восстановление из zmq.error.ZMQError: адрес уже используется

Я ударил Ctrl-C при запуске соединения с PAIR (неблокирующими клиентскими серверами) с ZMQ. Позже, когда я попытался запустить шаблон REQ-REP (блокирование клиентского подключения к одному серверу), я все равно получаю сообщение об ошибке « Address already in use . Я попытался запустить netstat с netstat -ltnp | grep :<my port> netstat -ltnp | grep :<my port> но это не указывает какой-либо процесс.

Итак, кто именно использует этот адрес?

  • Socket Thread и PyGTK
  • Передача и получение массивов через Sockets
  • Многочисленные клиенты Python Socket
  • Python TCP Server принимает команды соединений и широковещания
  • Извлечение полученных данных в сокет tcp в Python
  • Отсутствует mysql.sock; приводящий OperationalError: (2002, «Не удается подключиться к локальному серверу MySQL через сокет» /tmp/mysql.sock '(2) »)
  • Также как можно изящно отключить такие соединения сокетов?

  • Как языки сценариев используют сокеты?
  • socket.shutdown vs socket.close
  • Тайм-аут чтения с использованием либо urllib2, либо любой другой http-библиотеки
  • Возможно ли перемещать / объединять сообщения между очередями RabbitMQ?
  • python asyncore отслеживает клиентов
  • Почему соединение сокета между двумя скриптами python ломается, если один из них запущен с помощью Popen?
  • 3 Solutions collect form web for “Восстановление из zmq.error.ZMQError: адрес уже используется”

    Вопрос 1:

    Если вы используете sudo netstat -ltnp , в операционной системе типа Linux вы, скорее всего, увидите процесс, владеющий портом. Убейте его с помощью kill -9 <pid> .

    Вопрос 2:

    Когда вы выходите из программы, закройте свои сокеты, а затем вызовите zmq_ctx_destroy (). Это разрушает контекст. См. http://zguide.zeromq.org/page:all#toc17 для получения дополнительной информации.

    В этот самый момент:

     reboot 

    Следующий:

    начните с использования try: / except: / finally: конструкторы инкапсуляции, которые помогут вам обеспечить изящный выход из всех распределений zmq, в том числе. все Socket -s ' .close() и Context .Term() без каких-либо висячих сирот (-ов) утечки памяти, даже если любая кнопка паники или необработанное исключение прерывает выполнение кода в целом с потерей ссылок на ваши зависающие, связанные с сетью, экземпляры.

    Иногда другой процесс использования zeromq поддерживает использование порта, а netstat не указывает на то, что прослушивание другого процесса (так что netstat -lntp не будет показывать его), а скорее показывает установленное соединение на порту с тем же хостом / портом с обоих концов. После уничтожения этого другого процесса порт теперь доступен для использования.

    Причина №1: У меня это произошло, потому что у меня были порты прослушивания zeromq, настроенные в диапазоне эфемерных портов (на Linux, например 32768-61000), которые используются в качестве локальной стороны исходящих подключений, а мои службы должны подключаться к другим службам в одной коробке. Процент от времени, когда исходящее соединение получает эфемерный порт, который совпадает с портом прослушивания на поле, и вдруг «адрес уже используется». Я просто переместил все прослушивающие порты в сторону эфемерного диапазона портов, и все проблемы «адрес уже используется» ушли.

    Причина № 2: Спекуляция. Когда я столкнулся с аналогичными проблемами с другими сетевыми библиотеками python, процесс нарушения был ранее запущен из процесса прослушивания с использованием подпроцесса или аналогичного, и возникла проблема с утечкой сокета в дочерний процесс; если родительский процесс вышел без закрытия сокета, сокет остался бы в живых и принадлежал дочернему процессу, и хотя дочерний процесс действительно ничего не знал о сокете, он все равно оставался бы таким, чтобы другие процессы не могли используй это.

    Если это проблема, это может быть исправлено путем настройки флагов сокета перед подпроцессом, например (unix-specific):

     fd = sock.get(zmq.FD) old_flags = fcntl.fcntl(fd, fcntl.F_GETFD) fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) 

    Или, возможно, есть способ более правильно закрыть сокет в родительском процессе.

    Python - лучший язык программирования в мире.