day19-總結

"""author = Zard"""
import threading
from time import sleep
from datetime import datetime

主線程和子線程

默認情況下怖侦,進程有一個線程缚甩,這個線程叫主線程 -- 主線程是系統(tǒng)自動創(chuàng)建的
默認所有的代碼都是在主線程中執(zhí)行

程序猿通過代碼創(chuàng)建的線程都叫子線程

創(chuàng)建子線程

python中內(nèi)置的threading模塊中提供了和線程操作相關的類和方法

threading模塊中有個Thread類,這個類或者這個的子類的對象就是線程對象明场;
需要子線程的時候就創(chuàng)建Thread類的對象

def download(name):
  print(' %s 開始下載:%s ' % (datetime.now(),name))
  print(threading.current_thread())     # 查看當前執(zhí)行的線程
  sleep(5)
  print(' %s 下載結束:%s ' % (datetime.now(),name))

if __name__ == '__main__':
  # download('龍貓')
  # download('你的名字')

創(chuàng)建線程對象

1)語法
Thread(target=函數(shù),args=實參列表)    --  返回子線程對象
2)說明
target  -   必須要賦一個函數(shù)潦俺,這個函數(shù)會在子線程中調(diào)用
args    -   賦一個元組沈自,元組中的元素就是調(diào)用target函數(shù)的時候需要傳的參數(shù)

創(chuàng)建2個子線程

t1 = threading.Thread(target=download,args=('龍貓',))
t2 = threading.Thread(target=download,args=('你的名字',))

2.讓子線程開始執(zhí)行

線程對象元媚,start() -- 在子線程中調(diào)用target對應download断盛,并且將args中的值作為實參
t1.start()
t2.start()

程序的結束(進程的結束)

一個進程是否結束疼蛾,看是否這個進程中的每個線程都結束
線程結束:任務執(zhí)行完成肛跌,遇到exit(),發(fā)生異常(只針對發(fā)生的線程)
線程中遇到exit()察郁,線程直接結束
程序出現(xiàn)異常只會影響一個線程

from threading import *
from time import sleep
from datetime import datetime

推薦使用衍慎,類似于面向?qū)ο蟮姆绞?/p>

通過創(chuàng)建Thread類的子類對象來創(chuàng)建 子線程

1)聲明一個類繼承Thread

class DownloadThread(Thread):

    def __init__(self,name):
        super().__init__()
        self.name = name

2)實現(xiàn)run方法,這個方法中的代碼就是會在子線程中執(zhí)行的代碼

def run(self) -> None:
      print(' %s 開始下載:%s ' % (datetime.now(),self.name))
      print(current_thread())  # 查看當前執(zhí)行的線程
      sleep(5)
      print(' %s 下載結束:%s ' % (datetime.now(), self.name))


if __name__ == '__main__':
  # 3)創(chuàng)建子類的線程對象
  t1 = DownloadThread('你是魔鬼嗎皮钠?')

  # 4)通過start去執(zhí)行子線程中的任務
  t1.start()

  t2 = DownloadThread('程序猿猝死案例集錦')
  t2.start()

練習:用套接字實現(xiàn)西饵,一個服務器同時處理多個客戶端的功能(一個server可以同時和多個人進行聊天)

from socket import *
from threading import *
# 創(chuàng)建多線程
class Chat(Thread):
    def __init__(self,connection,address):
        super().__init__()
        self.connection = connection
        self.address = address

    def run(self) -> None:
        while True:
            re_message = self.connection.recv(1024).decode(encoding='utf-8')
            print(self.address,re_message)

            message = '你是**嗎?'
            self.connection.send(message.encode())

創(chuàng)建服務器對象

server = socket()
# 綁定ip地址
server.bind(('10.7.160.56',8888))
# 開始監(jiān)聽
server.listen(100)
# 服務器不斷運行
print('開始監(jiān)聽...')
while True:

    connection,address = server.accept()
    print('有新用戶鳞芙!')
    t1 = Chat(connection,address)
    t1.start()

from threading import *
from datetime import *
from time import *
from random import randint

class Download(Thread):
    def __init__(self,name):
        super().__init__()
        self.name = name


    def run(self) -> None:
        print('%s  - 開始下載 %s'%(datetime.now(),self.name))
        t = randint(2,6)
        sleep(t)
        print('%s  - 下載完成 %s'%(datetime.now(),self.name))


if __name__ == '__main__':
    print('=========================無憂==========================')
    t1 = Download('素人初攝.avi')
    t2 = Download('喪心病款.avi')
    t3 = Download('夜蒲團子.mp4')
    t2.start()
    t1.start()
    t3.start()

join的使用

線程對象.join()
其他的代碼

這兒的其他的代碼會等到指定的線程對象結束后才會執(zhí)行

t1.join()
t2.join()
t3.join()

from threading import Thread,Lock,RLock
from time import sleep

怎么加鎖

1)保證一個數(shù)據(jù)對應一把鎖:創(chuàng)建鎖對象
2)使用數(shù)據(jù)前加鎖:鎖對象.acquire()
3)保證數(shù)據(jù)使用完成后釋放鎖:鎖對象.release()

 數(shù)據(jù)
account = 1000
 1.創(chuàng)建鎖對象
lock = Lock()


def save_money(num):
    # 2.加鎖
    lock.acquire()

    print('開始存錢')
    global account
    balance = account
    sleep(4)
    account = balance + num
    # 3.釋放鎖
    lock.release()
    print('余額:%d'% account)

def draw_money(num):
    print('開始取錢')
    # 2.加鎖
    lock.acquire()
    global account
    balance = account
    if balance < 0:
        print('余額不足')
        return
    sleep(4)


    account = balance - num
    print('余額:%d'% account)
    # 3.釋放鎖
    lock.release()

t1 = Thread(target=save_money,args=(1000,))
t2 = Thread(target=draw_money,args=(500,))

t1.start()
t2.start()
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眷柔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子原朝,更是在濱河造成了極大的恐慌驯嘱,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳坠,死亡現(xiàn)場離奇詭異鞠评,居然都是意外死亡,警方通過查閱死者的電腦和手機壕鹉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門剃幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晾浴,你說我怎么就攤上這事负乡。” “怎么了脊凰?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵抖棘,是天一觀的道長。 經(jīng)常有香客問我狸涌,道長切省,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任帕胆,我火速辦了婚禮朝捆,結果婚禮上,老公的妹妹穿的比我還像新娘懒豹。我一直安慰自己芙盘,他們只是感情好诊杆,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著何陆,像睡著了一般晨汹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贷盲,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天淘这,我揣著相機與錄音,去河邊找鬼巩剖。 笑死铝穷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的佳魔。 我是一名探鬼主播曙聂,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鞠鲜!你這毒婦竟也來了宁脊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贤姆,失蹤者是張志新(化名)和其女友劉穎榆苞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞捡,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坐漏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碧信。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赊琳。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砰碴,靈堂內(nèi)的尸體忽然破棺而出躏筏,到底是詐尸還是另有隱情,我是刑警寧澤衣式,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布寸士,位于F島的核電站,受9級特大地震影響碴卧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乃正,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一住册、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓮具,春花似錦荧飞、人聲如沸凡人。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挠轴。三九已至,卻和暖如春耳幢,著一層夾襖步出監(jiān)牢的瞬間岸晦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工睛藻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留启上,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓店印,卻偏偏與公主長得像冈在,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子按摘,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 寫在前面的話 代碼中的# > 表示的是輸出結果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,743評論 0 8
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進程 之前我們已經(jīng)了解了操作系統(tǒng)中進程的概念炫贤,程序并不能單獨運行兴使,只有...
    go以恒閱讀 1,634評論 0 6
  • 網(wǎng)絡編程 1.socket socket又叫套接字,指的是網(wǎng)絡通信的兩端照激,分別是服務器和客戶端 socket編程指...
    灬小魚兒zzZ閱讀 177評論 0 0
  • 一发魄、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,723評論 0 10
  • pygame和多線程 事件 游戲中的事件:1.鼠標相關的事件MOUSEBUTTONDOWN - 鼠標按下 MOUS...
    xue_y閱讀 174評論 0 0