多线程并发
import socket
from multiprocessing import Process
def talk(sock):
while True:
msg_IP = sock.getpeername()
receive_msg = sock.recv(1024)
print("from%s:%s" % (msg_IP, receive_msg.decode("gbk")))
if len(receive_msg) == 0:
break
sock.close()
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ("192.168.133.60", 10000)
listen_socket.bind(address)
listen_socket.listen(100)
while True:
new_socket, peer_ip = listen_socket.accept()
send_msg = Process(target=talk, args=(new_socket,))
send_msg.start()
new_socket.close()
if __name__ == "__main__":
main()
创建进程池解决并发
import socket
from multiprocessing import Process
from multiprocessing.pool import Pool
def talk(sock):
while True:
msg_IP = sock.getpeername()
receive_msg = sock.recv(1024)
print("from%s:%s" % (msg_IP, receive_msg.decode("gbk")))
if len(receive_msg) == 0:
print("%s" % (msg_IP,))
break
sock.close()
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ("192.168.133.60", 8000)
listen_socket.bind(address)
listen_socket.listen(100)
while True:
new_socket, peer_ip = listen_socket.accept()
pool = Pool(1)
pool.apply(talk, args=(new_socket,))
new_socket.close()
if __name__ == "__main__":
main()
非阻塞单进程服务器
import socket
import time
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.setblocking(False)
address = ("192.168.133.60", 8080)
listen_socket.bind(address)
listen_socket.listen(100)
while True:
try:
new_sock, peer_name = listen_socket.accept()
except Exception as e:
pass
else:
receive_msg = new_sock.recv(1024)
print("%s:%s" % (peer_name, receive_msg.decode("gbk")))
send_msg = input(">>")
new_sock.send(send_msg)
if __name__ == "__main__":
main()
多线程服务器并发
import socket
import threading
from threading import Thread
def receive(sock):
while True:
peer_name = sock.getpeername()
msg = sock.recv(1024)
print("from%s:%s" % (str(peer_name), msg.decode("gbk")))
def send_demo(sock):
while True:
msg = input(">>")
sock.send(msg.encode("gbk"))
def send_msg(sock):
recive_msg = Thread(target=receive, args=(sock,))
send = Thread(target=send_demo, args=(sock,))
recive_msg.start()
send.start()
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ("192.168.133.60", 10000)
listen_socket.bind(address)
listen_socket.listen(100)
while True:
new_socket, peer_ip = listen_socket.accept()
receive = Thread(target=send_msg, args=(new_socket,))
receive.start()
if __name__ == "__main__":
main()
线程局部变量传递套接字
import socket
import threading
from threading import Thread
def receive():
sock = thread_map.name
while True:
peer_name = sock.getpeername()
msg = sock.recv(1024)
print("from%s:%s" % (str(peer_name), msg.decode("gbk")))
def send_demo():
sock = thread_map.name
while True:
msg = input(">>")
sock.send(msg.encode("gbk"))
def send_msg(sock):
thread_map.name = sock
recive_msg = Thread(target=receive)
send = Thread(target=send_demo)
recive_msg.start()
send.start()
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ("192.168.133.60", 10000)
listen_socket.bind(address)
listen_socket.listen(100)
while True:
new_socket, peer_ip = listen_socket.accept()
receive = Thread(target=send_msg, args=(new_socket,))
receive.start()
if __name__ == "__main__":
thread_map = threading.local()
main()
greenlet实现协程
from greenlet import greenlet
import time
def A():
while True:
print("----1----")
time.sleep(1)
gre2.switch()
def B():
while True:
print("----2----")
time.sleep(1)
gre1.switch()
def main():
gre1.switch()
if __name__ == "__main__":
gre1 = greenlet(A)
gre2 = greenlet(B)
main()
协程服务器
import socket
import gevent
from gevent import monkey
monkey.patch_all()
def receive_msg(socket):
print("1")
while True:
receive = socket.recv(1024)
if len(receive) > 0:
print("from%s:%s" % (socket.getpeername(), receive.decode("gbk")))
else:
break
socket.close()
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ("192.168.133.86", 8080)
listen_socket.bind(address)
listen_socket.listen(100)
while True:
new_socket, peer_name = listen_socket.accept()
print(peer_name)
print(socket.socket)
gevent.spawn(receive_msg, new_socket)
if __name__ == "__main__":
main()
epoll服务器
import socket
import select
def main():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ("192.168.133.144", 8080)
listen_socket.bind(address)
listen_socket.listen(100)
my_epoll = select.epoll()
my_epoll.register(listen_socket.fileno(), select.EPOLLIN | select.EPOLLET)
print(select.EPOLLIN)
print(select.EPOLLET)
print(help(select.EPOLLET))
socket_dic = {}
while True:
poll_list = my_epoll.poll()
print(poll_list)
for fd, event in poll_list:
if fd == listen_socket.fileno():
print(fd)
new_socket, peer_name = listen_socket.accept()
my_epoll.register(new_socket.fileno(), select.EPOLLIN | select.EPOLLET)
socket_dic[new_socket.fileno()] = new_socket
print(poll_list)
else:
use_socket = socket_dic[fd]
print(poll_list)
recv_msg = use_socket.recv(1024)
if len(recv_msg) > 0:
print("from %s :%s " % (use_socket.getpeername(), recv_msg.decode("gbk")))
else:
my_epoll.unregister(fd)
print(fd)
del socket_dic[fd]
use_socket.close()
if __name__ == "__main__":
main()