一、線程
定義:每個程序在運(yùn)行的時(shí)候(進(jìn)程)系統(tǒng)都會為這個進(jìn)程創(chuàng)建一個線程省咨,這個線程我們叫主線程玷室。程序員自己創(chuàng)建的線程叫子線程
多個任務(wù)在一個線程中是按順序一個一個執(zhí)行的(線程的串行)
多個線程的任務(wù)同時(shí)執(zhí)行實(shí)現(xiàn)方法:python通過threading標(biāo)準(zhǔn)庫來支持多線程
-
創(chuàng)建線程方式:
a.直接通過Thread類創(chuàng)建對象笤受,將需要在子線程中執(zhí)行的函數(shù)作為target參數(shù)傳進(jìn)去
b.寫一個自己的類去繼承Thread類
重寫當(dāng)前類的run方法敌蜂,run中的任務(wù)就是在子線程中執(zhí)行的任務(wù)創(chuàng)建當(dāng)前類的對象, 就是線程對象。然后調(diào)用start去執(zhí)行線程中任務(wù)
二章喉、例子
import time
import datetime
from random import randint
import threading
def download(file):
print(file,threading.current_thread())
print(datetime.datetime.now(),'開始下載:%s' % file)
# sleep(時(shí)間): 會將當(dāng)前線程阻塞指定的時(shí)間(停指定的時(shí)間然后再往后執(zhí)行)
# 時(shí)間單位:秒
time1 = randint(5, 10)
time.sleep(time1)
print(datetime.datetime.now(),'下載%s結(jié)束'%file,'總共耗時(shí):%d' % time1)
"""
python通過threading標(biāo)準(zhǔn)庫來支持多線程
"""
if __name__ == '__main__':
# download('肖生克的救贖')
# current_thread()獲取當(dāng)前線程
print(threading.current_thread())
# 1.創(chuàng)建一個線程對象
"""
Thread(target=, args=)
target: 需要傳一個需要在子線程中執(zhí)行的函數(shù)(類型是function的變量)
agrs: 在子線程中調(diào)用target對應(yīng)的函數(shù)的時(shí)候秸脱,該傳什么參數(shù)。類型是元祖
"""
t1 = threading.Thread(target=download, args=('阿甘正傳',))
t2 = threading.Thread(target=download, args=('肖生克的救贖',))
# 2.讓子線程去執(zhí)行任務(wù)
t1.start()
t2.start()
print('===========')
三妥色、線程和網(wǎng)絡(luò)通信的應(yīng)用
1.服務(wù)器
"""__author__ = 余婷"""
import socket
from threading import Thread
class ConversationThread(Thread):
def __init__(self, conversation: socket.socket, addr):
super().__init__()
self.conversation = conversation
self.addr = addr
def run(self):
# 保持通話
while True:
# 接收消息
message_re = self.conversation.recv(1024).decode('utf-8')
print(self.addr[0], ':', message_re)
# 發(fā)送消息
message = 'hi %s遏片,你好!' % self.addr[0]
self.conversation.send(message.encode('utf-8'))
def creat_server():
server = socket.socket()
server.bind(('10.7.156.97', 8081))
server.listen(512)
# 讓服務(wù)器一直運(yùn)行
while True:
# 會阻塞線程
conversation, addr = server.accept()
# 創(chuàng)建處理這個請求對應(yīng)的子線程
t = ConversationThread(conversation, addr)
t.start()
if __name__ == '__main__':
creat_server()
2.客戶端
"""__author__ = 余婷"""
import socket
client = socket.socket()
client.connect(('10.7.156.97', 8081))
while True:
message = input('>>>')
client.send(message.encode('utf-8'))
message_re = client.recv(1024).decode('utf-8')
print(message_re)