日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python线程通信 消息传递_Python并发编程之线程消息通信机制/任务协调(四)

發(fā)布時間:2025/3/15 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python线程通信 消息传递_Python并发编程之线程消息通信机制/任务协调(四) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家好,并發(fā)編程進入第四篇。

本文目錄

前言

Event事件

Condition

Queue隊列

總結(jié)

.前言

前面我已經(jīng)向大家介紹了,如何使用創(chuàng)建線程,啟動線程。相信大家都會有這樣一個想法,線程無非就是創(chuàng)建一下,然后再start()下,實在是太簡單了。

可是要知道,在真實的項目中,實際場景可要我們舉的例子要復(fù)雜的多得多,不同線程的執(zhí)行可能是有順序的,或者說他們的執(zhí)行是有條件的,是要受控制的。如果僅僅依靠前面學(xué)的那點淺薄的知識,是遠遠不夠的。

那今天,我們就來探討一下如何控制線程的觸發(fā)執(zhí)行。

要實現(xiàn)對多個線程進行控制,其實本質(zhì)上就是消息通信機制在起作用,利用這個機制發(fā)送指令,告訴線程,什么時候可以執(zhí)行,什么時候不可以執(zhí)行,執(zhí)行什么內(nèi)容。

經(jīng)過我的總結(jié),線程中通信方法大致有如下三種:

threading.Event

threading.Condition

queue.Queue

先拋出結(jié)論,接下來我們來一一探討下。

.Event事件

Python提供了非常簡單的通信機制?Threading.Event,通用的條件變量。多個線程可以等待某個事件的發(fā)生,在事件發(fā)生后,所有的線程都會被激活。

關(guān)于Event的使用也超級簡單,就三個函數(shù)

event = threading.Event()

# 重置event,使得所有該event事件都處于待命狀態(tài)

event.clear()

# 等待接收event的指令,決定是否阻塞程序執(zhí)行

event.wait()

# 發(fā)送event指令,使所有設(shè)置該event事件的線程執(zhí)行

event.set()

舉個例子來看下。

import time

import threading

class MyThread(threading.Thread):

def __init__(self, name, event):

super().__init__()

self.name = name

self.event = event

def run(self):

print('Thread: {} start at {}'.format(self.name, time.ctime(time.time())))

# 等待event.set()后,才能往下執(zhí)行

self.event.wait()

print('Thread: {} finish at {}'.format(self.name, time.ctime(time.time())))

threads = []

event = threading.Event()

# 定義五個線程

[threads.append(MyThread(str(i), event)) for i in range(1,5)]

# 重置event,使得event.wait()起到阻塞作用

event.clear()

# 啟動所有線程

[t.start() for t in threads]

print('等待5s...')

time.sleep(5)

print('喚醒所有線程...')

event.set()

執(zhí)行一下,看看結(jié)果

Thread: 1 start at Sun May 13 20:38:08 2018

Thread: 2 start at Sun May 13 20:38:08 2018

Thread: 3 start at Sun May 13 20:38:08 2018

Thread: 4 start at Sun May 13 20:38:08 2018

等待5s...

喚醒所有線程...

Thread: 1 finish at Sun May 13 20:38:13 2018

Thread: 4 finish at Sun May 13 20:38:13 2018

Thread: 2 finish at Sun May 13 20:38:13 2018

Thread: 3 finish at Sun May 13 20:38:13 2018

可見在所有線程都啟動(start())后,并不會執(zhí)行完,而是都在self.event.wait()止住了,需要我們通過event.set()來給所有線程發(fā)送執(zhí)行指令才能往下執(zhí)行。

.Condition

Condition和Event 是類似的,并沒有多大區(qū)別。

同樣,Condition也只需要掌握幾個函數(shù)即可。

cond = threading.Condition()

# 類似lock.acquire()

cond.acquire()

# 類似lock.release()

cond.release()

# 等待指定觸發(fā),同時會釋放對鎖的獲取,直到被notify才重新占有瑣。

cond.wait()

# 發(fā)送指定,觸發(fā)執(zhí)行

cond.notify()

舉個網(wǎng)上一個比較趣的捉迷藏的例子來看看

import threading, time

class Hider(threading.Thread):

def __init__(self, cond, name):

super(Hider, self).__init__()

self.cond = cond

self.name = name

def run(self):

time.sleep(1) ?#確保先運行Seeker中的方法

self.cond.acquire()

print(self.name + ': 我已經(jīng)把眼睛蒙上了')

self.cond.notify()

self.cond.wait()

print(self.name + ': 我找到你了哦 ~_~')

self.cond.notify()

self.cond.release()

print(self.name + ': 我贏了')

class Seeker(threading.Thread):

def __init__(self, cond, name):

super(Seeker, self).__init__()

self.cond = cond

self.name = name

def run(self):

self.cond.acquire()

self.cond.wait()

print(self.name + ': 我已經(jīng)藏好了,你快來找我吧')

self.cond.notify()

self.cond.wait()

self.cond.release()

print(self.name + ': 被你找到了,哎~~~')

cond = threading.Condition()

seeker = Seeker(cond, 'seeker')

hider = Hider(cond, 'hider')

seeker.start()

hider.start()

通過cond來通信,阻塞自己,并使對方執(zhí)行。從而,達到有順序的執(zhí)行。

看下結(jié)果

hider: ? 我已經(jīng)把眼睛蒙上了

seeker: ?我已經(jīng)藏好了,你快來找我吧

hider: ? 我找到你了 ~_~

hider: ? 我贏了

seeker: ?被你找到了,哎~~~

.Queue隊列

終于到了我們今天的主角了。

從一個線程向另一個線程發(fā)送數(shù)據(jù)最安全的方式可能就是使用 queue 庫中的隊列了。創(chuàng)建一個被多個線程共享的 Queue 對象,這些線程通過使用put()?和?get()?操作來向隊列中添加或者刪除元素。

同樣,對于Queue,我們也只需要掌握幾個函數(shù)即可。

from queue import Queue

# maxsize默認為0,不受限

# 一旦>0,而消息數(shù)又達到限制,q.put()也將阻塞

q = Queue(maxsize=0)

# 阻塞程序,等待隊列消息。

q.get()

# 獲取消息,設(shè)置超時時間

q.get(timeout=5.0)

# 發(fā)送消息

q.put()

# 等待所有的消息都被消費完

q.join()

# 以下三個方法,知道就好,代碼中不要使用

# 查詢當前隊列的消息個數(shù)

q.qsize()

# 隊列消息是否都被消費完,True/False

q.empty()

# 檢測隊列里消息是否已滿

q.full()

函數(shù)會比之前的多一些,同時也從另一方面說明了其功能更加豐富。

我來舉個老師點名的例子,大家感受一下。

from queue import Queue

from threading import Thread

import time

class Student(Thread):

def __init__(self, name, queue):

super().__init__()

self.name = name

self.queue = queue

def run(self):

while True:

# 阻塞程序,時刻監(jiān)聽老師,接收消息

msg = self.queue.get()

# 一旦發(fā)現(xiàn)點到自己名字,就趕緊答到

if msg == self.name:

print("{}:到!".format(self.name))

class Teacher:

def __init__(self, queue):

self.queue=queue

def call(self, student_name):

print("老師:{}來了沒?".format(student_name))

# 發(fā)送消息,要點誰的名

self.queue.put(student_name)

queue = Queue()

teacher = Teacher(queue=queue)

s1 = Student(name="小明", queue=queue)

s2 = Student(name="小亮", queue=queue)

s1.start()

s2.start()

print('開始點名~')

teacher.call('小明')

time.sleep(1)

teacher.call('小亮')

運行結(jié)果如下

開始點名~

老師:小明來了沒?

小明:到!

老師:小亮來了沒?

小亮:到!

.總結(jié)

學(xué)習(xí)了以上三種通信方法,我們很容易就能發(fā)現(xiàn)Event?和Condition?是threading模塊原生提供的模塊,原理簡單,功能單一,它能發(fā)送?True?和?False?的指令,所以只能適用于某些簡單的場景中。

而Queue則是比較高級的模塊,它可能發(fā)送任何類型的消息,包括字符串、字典等。其內(nèi)部實現(xiàn)其實也引用了Condition模塊(譬如put和get函數(shù)的阻塞),正是其對Condition進行了功能擴展,所以功能更加豐富,更能滿足實際應(yīng)用。

總結(jié)

以上是生活随笔為你收集整理的python线程通信 消息传递_Python并发编程之线程消息通信机制/任务协调(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 深夜福利91 | 午夜影院在线看 | 视频一区二区中文字幕 | 美女在线免费视频 | 中文字幕在线字幕中文 | 国产精品亚洲αv天堂无码 伊人性视频 | 亚洲成人日韩在线 | 久久亚洲av午夜福利精品一区 | 中国一级特黄毛片 | 亚洲永久网站 | 国产欧美日韩视频在线观看 | 国产青青在线 | 天天插夜夜 | 成人免费看片入口 | 欧美精品区 | 97碰| 成人短视频在线播放 | 18禁一区二区 | 少妇人妻偷人精品无码视频 | 看毛片看毛片 | 欧美蜜臀| 亚洲a网| 亚洲国产图片 | 男女爱爱网站 | 视频在线亚洲 | 三级黄色小视频 | 美女吞精视频 | 中文字幕在线观看网 | 日韩精品中文字幕一区 | 久久爱综合网 | 高清在线一区二区 | www国产在线观看 | 97色资源 | 99re在线精品视频 | 在线免费观看视频 | 亚洲午夜精品一区二区三区他趣 | 妻子的性幻想 | 秋霞影院一区二区 | 爱情岛论坛自拍 | 日本视频www | 欧美黄网站在线观看 | 久久久久久亚洲精品中文字幕 | 国产黄色一级网站 | 婷婷综合网 | 香蕉国产精品 | 西西大胆午夜视频 | 韩国av免费观看 | 日本少妇性高潮 | 欧洲一区二区三区四区 | 男插女动态图 | 国产精品入口麻豆九色 | 超碰在线观看免费版 | brazzers精品成人一区 | 久久国产一二三 | 懂色av一区 | 伊人影院视频 | 一级久久久久久久 | 日毛片| 精品视频亚洲 | 在线观看福利视频 | 人人干人人爽 | 日韩一区二区中文字幕 | 网站毛片| 成人在线观看一区 | 中文字幕欧美日韩 | 伊人国产在线视频 | 一区二区三区在线观看免费视频 | 日韩黄大片 | 欧美交换 | 91九色网站 | 国产片淫乱18一级毛片动态图 | 深夜激情网 | 成人看的毛片 | 五月天国产 | 秒拍福利视频 | 亚洲日本在线观看视频 | 久久精品一区二区三区黑人印度 | 日本在线一区二区三区 | 成人免费视频网站在线看 | 少妇欧美激情一区二区三区 | 女人av在线 | 成人免费va视频 | 无码人妻精品一区二区中文 | 精品久久久久中文慕人妻 | 狼人综合av| 能看的av | 欧美不卡一区二区 | 欧美a网站 | 日韩成人av毛片 | 欧美视频在线看 | 狠狠做深爱婷婷久久综合一区 | 色婷婷激情五月 | 日本中文在线视频 | 久久aaa | 色94色欧美 | 99成人在线观看 | 国产乱色精品成人免费视频 | 国产成人在线网站 | www天堂网|