(Tôi đang sử dụng các mô-đun pyprocessing trong ví dụ này, nhưng thay thế chế biến với đa có lẽ nên làm việc nếu bạn chạy python 2.6 hoặc sử dụng multiprocessing backport)Đúng cách hủy chấp nhận và đóng một kết nối Python/xử lý đa Listener
Tôi hiện đang có một chương trình lắng nghe một unix socket (sử dụng một processing.connection.Listener), chấp nhận các kết nối và sinh ra một thread xử lý yêu cầu. Tại một thời điểm nhất định, tôi muốn thoát khỏi quá trình một cách duyên dáng, nhưng vì cuộc gọi accept() đang chặn và tôi không thấy cách nào để hủy bỏ nó một cách tốt đẹp. Tôi có một cách mà làm việc ở đây (OS X) ít nhất, thiết lập một xử lý tín hiệu và tín hiệu quá trình này từ thread khác như vậy:
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...'
Cách duy nhất khác mà tôi đã nghĩ đến việc là tiếp cận sâu vào kết nối (listener._listener._socket) và thiết lập tùy chọn không chặn ... nhưng điều đó có thể có một số tác dụng phụ và thường thực sự đáng sợ.
Có ai có cách thanh lịch hơn (và thậm chí có thể chính xác!) Để hoàn thành việc này không? Nó cần phải được di động với OS X, Linux và BSD, nhưng tính di động của Windows vv là không cần thiết.
Làm rõ: Cảm ơn tất cả mọi người! Như thường lệ, sự mơ hồ trong câu hỏi ban đầu của tôi được tiết lộ :)
- Tôi cần thực hiện dọn dẹp sau khi tôi đã hủy nghe và tôi không muốn thực sự thoát khỏi quá trình đó.
- tôi cần để có thể truy cập vào quá trình này từ các quá trình khác không sinh ra từ cùng một mẹ, mà làm cho Queues trở nên cồng kềnh
- Những lý do cho đề là rằng:
- Họ truy cập vào một trạng thái chia sẻ. Trên thực tế nhiều hơn hoặc ít hơn một cơ sở dữ liệu trong bộ nhớ phổ biến, vì vậy tôi cho rằng nó có thể được thực hiện khác nhau.
- Tôi phải có thể có nhiều kết nối được chấp nhận cùng một lúc, nhưng các chuỗi thực tế đang chặn phần lớn thời gian. Mỗi kết nối được chấp nhận sinh ra một luồng mới; điều này để không chặn tất cả các máy khách trên các dịch vụ I/O.
đề vs quá trình Về, tôi sử dụng chủ đề cho việc chặn ops tôi non-blocking và quy trình để cho phép đa xử lý.
Không phải là một ý tưởng tồi cho mỗi se, nhưng đối tượng Listener không phơi bày các ổ cắm cơ bản, và tôi không muốn vi phạm pháp luật demeters trong một cách lớn như vậy. Khi nó quay ra, tuy nhiên đó là chính xác những gì tôi phải làm :) –