线程基本使用
#子线程会等待所有的子线程结束后才结束
import threading
import time
def sing():
for i in range(5):
print("唱歌")
time.sleep(0.5)
def dance():
for i in range(5):
print("跳舞")
time.sleep(0.5)
if __name__ == '__main__':
t1 = threading.Thread(target=sing) # 注意函数名是没有小括号的
t1.start()
t2 = threading.Thread(target=dance) # 注意函数名是没有小括号的
t2.start()
print("主线程结束了!")
活跃进程数
threadList = threading.enumerate() #查看活跃线程数量
print(len(threadList))
线程名称
print(threading.current_thread())
线程传参
- 元组传递
- 字典传递
t1 = threading.Thread(target=sing, args=(10,20,30)) # 注意函数名是没有小括号的
t1 = threading.Thread(target=sing, kwargs={"a":10,"b":20,"c":30})
守护线程
#子线程会等待所有的子线程结束后才结束
import threading
import time
def sing(a,b,c):
print("参数:",a,b,c)
for i in range(10):
print("唱歌")
time.sleep(0.5)
if __name__ == '__main__':
t1 = threading.Thread(target=sing, kwargs={"a":10,"b":20,"c":30}) # 注意函数名是没有小括号的
#子线程守护主线程 主线程结束则子线程也结束
t1.setDaemon(True)
t1.start()
time.sleep(2)
print("主线程结束了!")
多线程版TCP
import socket
import threading
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建套接字
tcpSocket.bind(("",8080)) #元组
tcpSocket.listen(128) #监听上限 在windows 128有效 在linux无效
def doWork(newSocket,ipPort):
while True:
recvData = newSocket.recv(1024)
# 当接收到数据为空的时候,表示客户端已经断开连接了
if recvData:
print(recvData.decode("GBK"))
else:
print("客户端%s断开连接!"%str(ipPort))
newSocket.close()
break
while True:
newSocket,ipPort = tcpSocket.accept() #阻塞等待客户端连接 ipPort是个元组只有两个元素
print(ipPort)
t1 = threading.Thread(target=doWork, args=(newSocket,ipPort))
t1.setDaemon(True)
t1.start()
tcpSocket.close()
多线程版WebServer
import socket
import threading
#导入模块
from application import app
class WebServer(object):
def __init__(self):
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcpSocket.bind(("", 8080)) # 元组
tcpSocket.listen(128) # 监听上限 在windows 128有效 在linux无效
self.tcpSocket = tcpSocket
def start(self):
while True:
newSocket, ipPort = self.tcpSocket.accept() # 阻塞等待客户端连接 ipPort是个元组只有两个元素
#用多线程去处理每个新连接的套接字
# self.requestHandler(newSocket, ipPort)
t1 = threading.Thread(target=self.requestHandler,args=(newSocket, ipPort))
t1.setDaemon(True)
t1.start()
def requestHandler(self, newsocket,ipPort):
receiveData = newsocket.recv(1024)
if not receiveData:
print("%s客户端已经断开!"%str(ipPort))
newsocket.close()
return
#拆分请求
responseData = app.app("staticPage", receiveData, ipPort)
newsocket.send(responseData)
newsocket.close()
def main():
ws = WebServer()
ws.start()
if __name__ == '__main__':
main()
协程版Web server
import socket
import gevent
from gevent import monkey
monkey.patch_all()
#导入模块
from application import app
class WebServer(object):
def __init__(self):
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcpSocket.bind(("", 8080)) # 元组
tcpSocket.listen(128) # 监听上限 在windows 128有效 在linux无效
self.tcpSocket = tcpSocket
def start(self):
while True:
newSocket, ipPort = self.tcpSocket.accept() # 阻塞等待客户端连接 ipPort是个元组只有两个元素
print(ipPort)
#用多线程去处理每个新连接的套接字
# self.requestHandler(newSocket, ipPort)
# t1 = threading.Thread(target=self.requestHandler,args=(newSocket, ipPort))
# t1.setDaemon(True)
# t1.start()
gevent.spawn(self.requestHandler,newSocket, ipPort)
def requestHandler(self, newsocket,ipPort):
receiveData = newsocket.recv(1024)
if not receiveData:
print("%s客户端已经断开!"%str(ipPort))
newsocket.close()
return
#拆分请求
responseData = app.app("staticPage", receiveData, ipPort)
newsocket.send(responseData)
newsocket.close()
def main():
ws = WebServer()
ws.start()
if __name__ == '__main__':
main()
来源:CSDN
作者:姚军博客
链接:https://blog.csdn.net/SYaoJun/article/details/103896590