Должен ли я закрыть сокет zeromq явно в Python? - PullRequest
7 голосов
/ 26 января 2012

В C / C ++ подобных языках закрытие сокета zeromq явно является обязательным, что я понимаю. Но в некоторых языках более высокого уровня, таких как php и python, которые имеют механизм сборки мусора, нужно ли явно закрывать сокеты?

В php нет ZMQSocket :: close (), а в python, документация pyzmq говорит, что socket.close () может быть опущен, так как он будет автоматически закрыт во время сборки мусора.

Итак, мой вопрос: нужно ли вручную закрывать его или нет? ...

Ответы [ 4 ]

3 голосов
/ 04 апреля 2016

Все меняется - закрытие розеток не выполняется автоматически

В текущих состояниях документации закрывающие сокеты (или вызов Context.term() не нужны, так как это делается автоматически при сборке мусора.

Однако, pyzmq changelog сообщает , что, начиная с версии 14.3.0, это не так, поскольку изменения в Python 3.4 не позволяют делать это разумно.

Я подал проблему Обновите строки документации о context.term() и socket.close() относительно сбора мусора для этого.

2 голосов
/ 22 февраля 2012

Всегда правильно закрывать любые ресурсы ввода / вывода, когда вы закончите с ними. Сборщик мусора закроет их в конце концов. Он может закрыть его сразу же, как только последняя ссылка выйдет из области видимости. Он может закрыть его при выходе из вашей программы. Пока вы ждете этого, ресурс остается открытым, занимая память, используя указатели файлов и в целом поглощая системные ресурсы. Для небольшой, недолгой программы это может не быть большой проблемой, но если ваше программное обеспечение является долгоживущим или устанавливает много соединений, это вернется к вам.

Ответ: это зависит. Если ваша система зависит от того, закрывается ли сокет, то безопаснее закрывать их явно. Если у вас все в порядке с закрытием сокета в какое-то неопределенное время в будущем, вы можете сэкономить немного времени на кодирование и немного упростить свою программу, просто позволив сборщику мусора обработать ее.

1 голос
/ 26 января 2012

Рекомендуется закрывать используемые вами ресурсы.

Обычно при сборе мусора все закрывается.Но это деталь реализации, когда вызывается __del__().В CPython у вас есть подсчет ссылок, и объекты отбрасываются, как только они больше не используются.Другие реализации, такие как Jython и т. Д., Могут работать по-разному.

Реализация может отложить сборку мусора или вообще пропустить ее - вопрос качества реализации, как сборка мусора, реализуется, если нет объектовсобраны, которые все еще доступны.

В 2.5 или 2.6 были введены менеджеры контекста, чтобы справиться именно с такими проблемами.С тех пор считается, что стиль goot работает с файлами следующим образом:

with open(...) as f:
    # do stuff with file object f
# now it is automatically closed.

Я не знаю zeromq, но, возможно, он также поддерживает менеджеры контекста.

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

1 голос
/ 26 января 2012

Ты не.Вы можете закрыть или удалить вещи явно в Python, когда:

  • Порядок становится важным, например, требуется закрыть соединение, прежде чем вы сможете продолжить.
  • Ваши ссылки на объекты будут сохранятьсяв течение длительного времени, и ресурс больше не потребуется через некоторое время.Это может произойти, если вы храните их в списках или в качестве переменных-членов.Вы должны явно закрыть ресурс или удалить ссылки на него, когда закончите.

Вообще говоря, педантично и преждевременно даже думать о таких вещах в Python.

...