2012-01-26 4 views
5

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

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

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

ответ

2

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

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

1

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

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

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

+0

I Противоположно второму сенарио, о котором вы говорили выше. В процессе daemon я открою сокет zmq и удерживаю эту ссылку до тех пор, пока процесс не будет остановлен, например. получать SIGTERM. В этот момент я должен явно вызвать socket.close() или позволить gc выполнить задание? –

+0

@Jerry: В этом случае просто прекратите процесс. Ресурсы будут освобождены операционной системой. ZMQ будет решать, что к чему. Кроме того, GC обычно будет пытаться очистить столько, сколько может при таких обстоятельствах. –

1

Считается хорошим стилем для закрытия используемых вами ресурсов.

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

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

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

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

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

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

2

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

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

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

Я подал вопрос Update docstrings about context.term() and socket.close() with regards to garbage collection для этого.

Смежные вопросы