python多线程

て烟熏妆下的殇ゞ 提交于 2020-01-08 19:59:08

线程基本使用

#子线程会等待所有的子线程结束后才结束
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())

线程传参

  1. 元组传递
  2. 字典传递
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()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!