一斗塘、多線程
每個(gè)程序在運(yùn)行的時(shí)候(進(jìn)程)系統(tǒng)都會(huì)為這個(gè)進(jìn)程創(chuàng)建一個(gè)線程赢织,這個(gè)線程我們叫主線程。
程序員自己創(chuàng)建的線程叫子線程
多個(gè)任務(wù)在一個(gè)線程中是按順序一個(gè)一個(gè)執(zhí)行的(線程的串行)
多個(gè)線程的任務(wù)同時(shí)執(zhí)行
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í)間): 會(huì)將當(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)建一個(gè)線程對(duì)象
"""
Thread(target=, args=)
target: 需要傳一個(gè)需要在子線程中執(zhí)行的函數(shù)(類型是function的變量)
agrs: 在子線程中調(diào)用target對(duì)應(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('===========')
二瞄桨、創(chuàng)建線程
from threading import Thread,current_thread
import time
from datetime import datetime
"""
創(chuàng)建線程方式1:
直接通過Thread類創(chuàng)建對(duì)象,將需要在子線程中執(zhí)行的函數(shù)作為target參數(shù)傳進(jìn)去
創(chuàng)建線程方式2:
- a.寫一個(gè)自己的類去繼承Thread類
- b.重寫當(dāng)前類的run方法芯侥,run中的任務(wù)就是在子線程中執(zhí)行的任務(wù)
- c.創(chuàng)建當(dāng)前類的對(duì)象, 就是線程對(duì)象。然后調(diào)用start去執(zhí)行線程中任務(wù)
"""
1.創(chuàng)建線程類
class DownLoadThread(Thread):
"""下載線程類"""
def __init__(self, file):
super().__init__()
self.file = file
def run(self):
# 注意:如果需要給run方法中傳數(shù)據(jù)廓俭,通過當(dāng)前類的屬性來傳
print('%s開始下載:' % self.file, datetime.now())
time.sleep(5)
print('%s下載結(jié)束:' % self.file, datetime.now())
2.創(chuàng)建線程對(duì)象
t1 = DownLoadThread('阿甘正傳')
t2 = DownLoadThread('沉默的羔羊')
3.通過start去執(zhí)行run中的任務(wù)
"""
注意: 如果直接調(diào)用run方法唉工,run方法中的任務(wù)不會(huì)在當(dāng)前的子線程中執(zhí)行
# t1.run()
t1.start()
t2.start()
三、多線程聊天的服務(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:
# 會(huì)阻塞線程
conversation, addr = server.accept()
# 創(chuàng)建處理這個(gè)請求對(duì)應(yīng)的子線程
t = ConversationThread(conversation, addr)
t.start()
if __name__ == '__main__':
creat_server()
四、客戶端
"""__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)
五竿报、發(fā)送服務(wù)器
"""__author__ = 余婷"""
import socket
server = socket.socket()
server.bind(('10.7.156.97', 8082))
server.listen(512)
while True:
conversation, addr = server.accept()
message_re = conversation.recv(1024).decode('utf-8')
if message_re == '1':
# 發(fā)送圖片
print('發(fā)送圖片')
with open('./files/luffy.jpeg', 'br') as f:
content = f.read()
conversation.send(content) # 發(fā)送圖片信息
conversation.close()
elif message_re == '2':
message = input('>>>')
conversation.send(message.encode('utf-8'))
conversation.close()
六、接收圖片文字客戶端
"""__author__ = 余婷"""
import socket
number = 0
page = """
===========================
1. 需要圖片
2. 需要文字
3. 通知結(jié)束
==========================="""
while True:
client = socket.socket()
client.connect(('10.7.156.97', 8082))
print(page)
value = input('請選擇(1-3):')
# 發(fā)送數(shù)據(jù)
client.send(value.encode('utf-8'))
# 接收服務(wù)器返回的數(shù)據(jù)
if value == '1':
data = bytes()
message_re = client.recv(1024)
while message_re:
print('接收到圖片')
data += message_re
message_re = client.recv(1024)
# 關(guān)閉連接
client.close()
number += 1
with open('./new%d.jpeg'%number, 'wb') as f:
f.write(data)
elif value == '2':
message_re = client.recv(1024)
print(message_re.decode('utf-8'))
# client.close()