Tôi gặp sự cố khi tìm hiểu về ổ cắm cho giao tiếp mạng. Tôi đã tạo một luồng đơn giản để lắng nghe các kết nối và tạo ra các quy trình để kết nối các máy khách, mặc dù vấn đề của tôi là tôi không thể lấy chủ đề để tham gia đúng như tôi đã không tìm thấy cách hủy lệnh socket.accept() - khi tôi muốn bỏ chương trình.Đóng ổ cắm nghe trong chủ đề python
Mã của tôi trông như thế này;
class ServerThread(threading.Thread):
def __init__(self, queue, host, port):
threading.Thread.__init__(self)
self.queue = queue
self.running = True
self.hostname = host
self.port = port
def run(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((self.hostname, self.port))
self.socket.listen(1)
while self.running:
try:
conn, address = self.socket.accept()
process = Process(target=server_slave, args=(conn, address, self.queue))
process.daemon = True
process.start()
except socket.timeout:
pass
def stop(self):
self.running = False
self.socket.close()
tôi đã được quản lý để có được những chương trình để đóng bằng cách thiết lập self.setDaemon(True)
và chỉ thoát khỏi chương trình chính, bàn giao tất cả mọi thứ để thu gom rác tuyệt vời - nhưng điều đó dường như là một giải pháp xấu. Tôi cũng đã cố gắng thiết lập một thời gian chờ cho các ổ cắm nhưng kết quả trong việc [Errno 35] Resource temporarily unavailable
(bất kể thời gian chờ thực tế, ngay cả khi tôi đặt nó đến năm ...).
Tôi đang làm gì sai? Tôi đã thiết kế các chủ đề một cách câm hoặc có tôi bị mất một cái gì đó về việc chấp nhận các kết nối?
'nhưng điều đó dường như là một giải pháp xấu' - nó hoạt động? Nếu bạn không thích có hệ điều hành chấm dứt tất cả các chủ đề của bạn, bạn có thể thử đóng các ổ cắm nghe từ chính, hoặc chủ đề khác. Điều đó thường làm cho accept() trả về 'sớm' với một lỗi. Hoạt động trên hầu hết các hệ điều hành/ngôn ngữ, nhưng không được thử bằng Python, vì vậy không phải là câu trả lời. –
Nó hoạt động - nhưng tôi có cảm giác tôi có thể không đối xử với khách hàng tiềm năng rất tốt trong việc đó. Tôi đã đăng một giải pháp có vẻ đẹp hơn vì nó cho phép mã hoàn thành, nhưng nó vẫn có vẻ hơi lạ vì nó kết thúc bằng cách tạo một quy trình mới mà tôi sẽ phải tham gia ngay lập tức. – Norling