>  기사  >  백엔드 개발  >  Python 표준 라이브러리 SocketServer 학습

Python 표준 라이브러리 SocketServer 학습

高洛峰
高洛峰원래의
2016-10-20 09:25:291273검색

소개: 전문가들은 소스 코드를 읽는 것이 매우 효율적인 학습 방법이라고 자주 말합니다. 하지만 우리 같은 초보자에게는 소스 코드를 읽는 것이 프로그래밍 아이디어와 코딩 표준을 익히는 좋은 방법입니다. 간단히 말해서, 소스 코드를 읽는 것은 만능이 아니며, 소스 코드를 읽지 않는 것은 절대 불가능합니다.

SocketServer는 표준 라이브러리 중 대표적인 라이브러리입니다. 소켓 기반의 소켓 서버를 빠르게 구축할 수 있는 프레임워크를 제공하며, Mix-in 기술을 통해 싱글 스레드 서버를 멀티 스레드 또는 멀티 프로세스 서버로 진화시킬 수 있습니다. Socketserver.py에는 많은 클래스가 있으며 하나씩 소개하고 이들 간의 관계를 살펴보겠습니다.

BaseServer, TCPServer, UDPServer, 전자는 후자 두 클래스의 상위 클래스입니다. TCP 및 UDP 서버에서 공유할 수 있는 메서드는 상위 클래스에서 구현되고, 구현해야 하는 추상 클래스는 하위 클래스에서 유지됩니다. 따라서 실제 작업에서는 특정 메서드를 직접 구현하거나 오버로드하지 않는 한 일반적으로 BaseServer 클래스를 상속해서는 안 됩니다. 또한 UnixStreamServer 및 UnixDatagramServer는 각각 TCPserver 및 UDPServer에서 상속됩니다. Unix라는 단어가 포함된 이 두 클래스는 *nix에서 로컬 소켓 서버를 구축하는 데 사용됩니다(로컬 소켓 액세스는 더 빠르지만 로컬 시스템의 프로세스 간 통신에만 사용할 수 있습니다)

다음은 ForkingMixIn 및 ThreadingMixIn입니다. 두 가지 혼합 클래스는 모두 Server 클래스에서 process_request 메서드의 새로운 구현을 제공합니다. 전자는 각 사용자 연결을 처리할 때 새 프로세스를 시작하고 후자는 새 스레드를 시작합니다. Server 클래스가 동시 처리를 구현하도록 하려면 다중 상속을 사용하면 됩니다. 또는 이미 혼합된

class ForkingUDPServer(ForkingMixIn, UDPServer): pass

class ForkingTCPServer(ForkingMixIn, TCPServer): pass

class ThreadingUDPServer(ThreadingMixIn, UDPServer)를 직접 사용합니다. pass

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

마지막으로 소개되지 않은 것은 BaseRequestHandler, StreamRequestHandler 및 DatagramRequestHandler이며, 전자는 공개적으로 제공하는 후자의 두 클래스의 상위 클래스입니다.

메소드

일반적으로 SocketServer를 사용할 때 적절한 서버 클래스만 인스턴스화하고 인스턴스화할 때 수신 대기 IP와 포트는 물론 이전에 RequestHandler에서 상속된 클래스도 전달합니다(필수) 자신이 서버의 요청 프로세서임)

여기서 특별한 주의가 필요합니다:

1. IP와 포트는 두 개의 별도 매개변수 대신 튜플로 전달됩니다.

2. Hanle 메소드가 실행된 후 각 고객 연결이 종료됩니다. 연결을 종료하지 않으려면 서버에서 def shutdown_request(self, request) 메소드를 다시 작성해야 합니다.

_____ me 멋진 구분선이네요 ______________

이 표준 라이브러리는 사용하기 매우 편리하다고 할 수 있지만, 아직 기능적으로는 몇 가지 단점이 있습니다.

1. 각 인스턴스 간 통신 메커니즘을 제공하지 않으므로 클라이언트는 서로 메시지를 보내기 위해 관찰자 모델을 구현해야 합니다.

그런데 이 기능은 SocketServer의 직무를 넘어서는 것 같습니다. 우리가 직접 구현할 수도 있고, 국내 타사 라이브러리인 python-message를 사용하여 스레드 간 메시지 기반 프로그래밍을 수행할 수도 있습니다.

2. 멀티스레드, 멀티프로세스 솔루션을 제공하지만, 비동기 솔루션이 없는 서버는 접속할 때마다 차단됩니다.

이 점은 매우 아쉽지만, 라이브러리도 그리 복잡하지 않습니다. 비동기 소켓 서버를 직접 작성할 수 있으며 혼자서도 충분한 음식과 의복을 가질 수 있습니다!

원래 소스코드를 해석한 것이기 때문에 이 글에는 코드가 없습니다. 독자들은 표준 라이브러리에 가서 직접 읽어볼 수 있습니다. 댓글은 정말 훌륭합니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.