多线程与多进程的实现
如果服务器希望能同时与多个客户端进行会话,那么最简单的方法就是利用操作系统内置的支持,是多个控制线程单独运行同一段代码。
可以创建多个共享相同内存空间的线程,也可以创建完全独立运行的进程。
优点:
简洁:直接使用单线程服务器的代码,创建多个进程运行它的多个副本。
缺点:
服务器能够同时通信的客户端数量受限于操作系统并发机制规模的限制,即使某个客户端处于空闲状态,或是缓慢运行状态,他也会占用整个线程/进程。
简单的多线程服务器代码:
#!/usr/bin/env python3 from threading import Thread def start_threads(socket,workers=4): t = (socket,) for i in range(workers): thread(target=socket.accept(), args=t).start()
这只是多线程程序的一种实现,如果不使用threading.Thread,而是使用multiprocessing.Process,那么操作系统会为
每个线程分配独立的内存空间以及文件描述符,这会增加操作系统的开销,但是能够更好的隔离进程,进一步降低服务器线程
造成主监控进程崩溃的概率。
这两个模块有一个共同的特点:
无论客户端是否正在发送请求,都会为每个连接的客户端分配一个开销较大的操作系统级控制线程,而然,服务器代码无需任何
改变就能够不互道多个线程(假设每个线程都建立了自己的数据库连接并管理自己打开的文件,因此无需协调不同线程之间的资源。)
socketserver模块实现多线程的:
由服务器的客户端连接池来决定启动的线程数量,不限制服务器最终启动的线程数量!这使得攻击者可以很容易令服务器过载。因此不推荐