(я использую pyprocessing модуль в этом примере, но заменяя обработку с многопроцессорной, вероятно, следует работать, если вы запустите python 2.6 или использовать multiprocessing backport)Правильный способ отмены принимать и закрытия соединения Python обработки/многопроцессорная Приёмника
В настоящее время у меня есть программа, которая слушает Unix-сокет (используя process.connection.Listener), принимает соединения и порождает поток, обрабатывающий запрос. В какой-то момент я хочу выйти из процесса изящно, но так как accept() - вызов блокируется, и я не вижу способа отменить его красивым способом. У меня есть один способ, который работает здесь (OS X), по крайней мере, установка обработчика сигналу и сигнализацию процесса из другого потока следующим образом:
import processing
from processing.connection import Listener
import threading
import time
import os
import signal
import socket
import errno
# This is actually called by the connection handler.
def closeme():
time.sleep(1)
print 'Closing socket...'
listener.close()
os.kill(processing.currentProcess().getPid(), signal.SIGPIPE)
oldsig = signal.signal(signal.SIGPIPE, lambda s, f: None)
listener = Listener('/tmp/asdf', 'AF_UNIX')
# This is a thread that handles one already accepted connection, left out for brevity
threading.Thread(target=closeme).start()
print 'Accepting...'
try:
listener.accept()
except socket.error, e:
if e.args[0] != errno.EINTR:
raise
# Cleanup here...
print 'Done...'
Единственный способ, которым я думал о том, проникающей глубоко в связь (listener._listener._socket) и установление параметра без блокировки ... но это, вероятно, имеет некоторые побочные эффекты и, как правило, очень страшно.
У кого-нибудь есть более элегантный (и, возможно, даже правильный!) Способ выполнения этого? Он должен быть портативным для OS X, Linux и BSD, но переносимость Windows и т. Д. Не требуется.
Уточнение: Спасибо всем! Как обычно, обнаруживаются двусмысленности в моем первоначальном вопросе :)
- Мне нужно выполнить очистку после того, как я отменил прослушивание, и я не всегда хочу, чтобы на самом деле выйти из этого процесса.
- мне нужно, чтобы иметь возможность получить доступ к этому процессу других процессов не порожден из того же родителя, что делает очереди громоздкие
- Причин потоков таково:
- Они доступ к общему государству. На самом деле более или менее общая база данных в памяти, поэтому я полагаю, что это можно сделать по-другому.
- Я должен иметь возможность одновременного подключения нескольких соединений, но фактические потоки блокируют что-то большую часть времени. Каждое принятое соединение создает новый поток; это, чтобы не блокировать всех клиентов в операциях ввода-вывода.
Что касается темы против процессов, я использую темы для создания моих Блокирующих OPS неблокирующих и процессов для того, чтобы мультипроцессирования.
Поскольку я не получаю операцию, я пытаюсь отменить Я не могу просто отправить данные в соединение (их нет), и есть также состояние гонки там. Во-вторых, это сработало бы, если бы я на самом деле был опросом данных, я не так; Я жду нового подключения. Или я неправильно понял вас? – 2008-12-10 22:24:37
Поскольку приемник принимает соединения в указанном сокете, не следует подключаться к нему из другого потока release accept() (используя multiprocessing.connection.Client)? Извиняюсь за двусмысленность во второй части моего ответа, я исправлю это. – codelogic 2008-12-10 22:59:36
Очереди не открываются из внешних инструментов и т. Д. Подключение к соке освободит accepy(), но я думаю, что создаст гонку. – 2008-12-12 23:38:58