當前位置:首頁 » 編程語言 » python多線程queue

python多線程queue

發布時間: 2022-05-22 14:55:30

1. 在python多線程程序中引入queue模塊可以解決什麼問題

Queue模塊提供了一個適用於多線程編程的先進先出數據結構,可以用來安全的傳遞多線程信息。 它本身就是線程安全的,使用put和get來處理數據,不會產生對一個數據同時讀寫的問題,所以是安全的。

2. python多線程怎樣同步

鎖機制
�6�9�6�9threading的Lock類,用該類的acquire函數進行加鎖,用realease函數進行解鎖

import threading
import time

class Num:
def __init__(self):
self.num = 0
self.lock = threading.Lock()
def add(self):
self.lock.acquire()#加鎖,鎖住相應的資源
self.num += 1
num = self.num
self.lock.release()#解鎖,離開該資源
return num

n = Num()
class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
time.sleep(2)
value = n.add()#將num加1,並輸出原來的數據和+1之後的數據
print(self.item,value)

for item in range(5):
t = jdThread(item)
t.start()
t.join()#使線程一個一個執行
�6�9�6�9當一個線程調用鎖的acquire()方法獲得鎖時,鎖就進入「locked」狀態。每次只有一個線程可以獲得鎖。如果此時另一個線程試圖獲得這個鎖,該線程就會變為「blocked」狀態,稱為「同步阻塞」(參見多線程的基本概念)。
�6�9�6�9直到擁有鎖的線程調用鎖的release()方法釋放鎖之後,鎖進入「unlocked」狀態。線程調度程序從處於同步阻塞狀態的線程中選擇一個來獲得鎖,並使得該線程進入運行(running)狀態。

信號量
�6�9�6�9信號量也提供acquire方法和release方法,每當調用acquire方法的時候,如果內部計數器大於0,則將其減1,如果內部計數器等於0,則會阻塞該線程,知道有線程調用了release方法將內部計數器更新到大於1位置。

import threading
import time
class Num:
def __init__(self):
self.num = 0
self.sem = threading.Semaphore(value = 3)
#允許最多三個線程同時訪問資源

def add(self):
self.sem.acquire()#內部計數器減1
self.num += 1
num = self.num
self.sem.release()#內部計數器加1
return num

n = Num()
class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
time.sleep(2)
value = n.add()
print(self.item,value)

for item in range(100):
t = jdThread(item)
t.start()
t.join()
條件判斷
�6�9�6�9所謂條件變數,即這種機制是在滿足了特定的條件後,線程才可以訪問相關的數據。
�6�9�6�9它使用Condition類來完成,由於它也可以像鎖機制那樣用,所以它也有acquire方法和release方法,而且它還有wait,notify,notifyAll方法。

"""
一個簡單的生產消費者模型,通過條件變數的控制產品數量的增減,調用一次生產者產品就是+1,調用一次消費者產品就會-1.
"""

"""
使用 Condition 類來完成,由於它也可以像鎖機制那樣用,所以它也有 acquire 方法和 release 方法,而且它還有
wait, notify, notifyAll 方法。
"""

import threading
import queue,time,random

class Goods:#產品類
def __init__(self):
self.count = 0
def add(self,num = 1):
self.count += num
def sub(self):
if self.count>=0:
self.count -= 1
def empty(self):
return self.count <= 0

class Procer(threading.Thread):#生產者類
def __init__(self,condition,goods,sleeptime = 1):#sleeptime=1
threading.Thread.__init__(self)
self.cond = condition
self.goods = goods
self.sleeptime = sleeptime
def run(self):
cond = self.cond
goods = self.goods
while True:
cond.acquire()#鎖住資源
goods.add()
print("產品數量:",goods.count,"生產者線程")
cond.notifyAll()#喚醒所有等待的線程--》其實就是喚醒消費者進程
cond.release()#解鎖資源
time.sleep(self.sleeptime)

class Consumer(threading.Thread):#消費者類
def __init__(self,condition,goods,sleeptime = 2):#sleeptime=2
threading.Thread.__init__(self)
self.cond = condition
self.goods = goods
self.sleeptime = sleeptime
def run(self):
cond = self.cond
goods = self.goods
while True:
time.sleep(self.sleeptime)
cond.acquire()#鎖住資源
while goods.empty():#如無產品則讓線程等待
cond.wait()
goods.sub()
print("產品數量:",goods.count,"消費者線程")
cond.release()#解鎖資源

g = Goods()
c = threading.Condition()

pro = Procer(c,g)
pro.start()

con = Consumer(c,g)
con.start()
同步隊列
�6�9�6�9put方法和task_done方法,queue有一個未完成任務數量num,put依次num+1,task依次num-1.任務都完成時任務結束。

import threading
import queue
import time
import random

'''
1.創建一個 Queue.Queue() 的實例,然後使用數據對它進行填充。
2.將經過填充數據的實例傳遞給線程類,後者是通過繼承 threading.Thread 的方式創建的。
3.每次從隊列中取出一個項目,並使用該線程中的數據和 run 方法以執行相應的工作。
4.在完成這項工作之後,使用 queue.task_done() 函數向任務已經完成的隊列發送一個信號。
5.對隊列執行 join 操作,實際上意味著等到隊列為空,再退出主程序。
'''

class jdThread(threading.Thread):
def __init__(self,index,queue):
threading.Thread.__init__(self)
self.index = index
self.queue = queue

def run(self):
while True:
time.sleep(1)
item = self.queue.get()
if item is None:
break
print("序號:",self.index,"任務",item,"完成")
self.queue.task_done()#task_done方法使得未完成的任務數量-1

q = queue.Queue(0)
'''
初始化函數接受一個數字來作為該隊列的容量,如果傳遞的是
一個小於等於0的數,那麼默認會認為該隊列的容量是無限的.
'''
for i in range(2):
jdThread(i,q).start()#兩個線程同時完成任務

for i in range(10):
q.put(i)#put方法使得未完成的任務數量+1

3. python 多線程

python支持多線程效果還不錯,很多方面都用到了python 多線程的知識,我前段時間用python 多線程寫了個處理生產者和消費者的問題,把代碼貼出來給你看下:
#encoding=utf-8
import threading
import random
import time
from Queue import Queue

class Procer(threading.Thread):

def __init__(self, threadname, queue):
threading.Thread.__init__(self, name = threadname)
self.sharedata = queue

def run(self):
for i in range(20):
print self.getName(),'adding',i,'to queue'
self.sharedata.put(i)
time.sleep(random.randrange(10)/10.0)
print self.getName(),'Finished'

# Consumer thread

class Consumer(threading.Thread):

def __init__(self, threadname, queue):
threading.Thread.__init__(self, name = threadname)
self.sharedata = queue

def run(self):

for i in range(20):
print self.getName(),'got a value:',self.sharedata.get()
time.sleep(random.randrange(10)/10.0)
print self.getName(),'Finished'

# Main thread

def main():

queue = Queue()
procer = Procer('Procer', queue)
consumer = Consumer('Consumer', queue)
print 'Starting threads ...'
procer.start()
consumer.start()
procer.join()
consumer.join()
print 'All threads have terminated.'
if __name__ == '__main__':
main()

如果你想要了解更多的python 多線程知識可以點下面的參考資料的地址,希望對有幫助!

4. Python多線程中隊列到底是個什麼概念

你首先需要創建一個線程池,其次將數據壓進線程池,然後讀取線程池。

import Queue
ThrQueue = Queue.Queue()
ThrQueue.put('數據')
ThrQueue.get()

當然以上步驟需要一個class來支撐,那說起來就多了!

5. python基於queue多線程怎麼退出不了

添加數據很容易。Queue本身就是有鎖的。建議在主線程(主程序中)添加,並處理其它線程的監督和處理結果的收集。 難的是取數據的線程。這個線程在取不到數據時,應該循環取,直到獲取程序退出的通知。 使用threading里的Thread類。Queue通過初始...

6. 怎麼樣在python多線程實現檢測伺服器

需要ping一個網段所有機器的在線情況,shell腳步運行時間太長,用python寫個多線程ping吧,代碼如下:

#!/usr/bin/python
#coding=utf-8
'''
Created on 2015-8-4
@author: Administrator
'''

import threading,subprocess
from time import ctime,sleep,time
import Queue

queue=Queue.Queue()

class ThreadUrl(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue=queue

def run(self):
while True:
host=self.queue.get()
ret=subprocess.call('ping -c 1 -w 1 '+host,shell=True,stdout=open('/dev/null','w'))
if ret:
print "%s is down" % host
else:
print "%s is up" % host
self.queue.task_done()

def main():
for i in range(100):
t=ThreadUrl(queue)
t.setDaemon(True)
t.start()
for host in b:
queue.put(host)
queue.join()

a=[]
with open('ip.txt') as f:
for line in f.readlines():
a.append(line.split()[0])
#print a

b=['192.168.3.'+str(x) for x in range(1,254)] #ping 192.168.3 網段
start=time()
main()
print "Elasped Time:%s" % (time()-start)

#t2=threading.Thread(target=move,args=('fff',))
#threads.append(t2)

'''
for i in a:
print ctime()
ping(i)
sleep(1)

if __name__ == '__main__':
for t in range(len(a)):
#t.setDaemon(True)
threads[t].start()
#t.join()
print "All over %s" % ctime()
'''

7. Python multiprocessing.Queue 和 Queue有區別嗎

覺得這個問題提的好,Queue是python自帶的標准庫,支持線程安全,所以多線程下可以隨意使用,不會出現寫沖突。multiprocessing.Queue這個multiprocessing模塊封裝的,它支持多進程之間的交互,比如master-worker模式下,master進程寫入,work進程消費的模式,支持進程之間的通信。如果使用python做比較復雜的情況下,這個模塊會經常用到

8. python3沒有queue模塊嗎

有的,直接使用就可以了。
import queue
lr = queue.Queue()

9. Python multiprocessing.Queue() 和 Queue有區別嗎

1.from Queue import Queue
這個是普通的隊列模式,類似於普通列表,先進先出模式,get方法會阻塞請求,直到有數據get出來為止
2.from multiprocessing.Queue import Queue
這個是多進程並發的Queue隊列,用於解決多進程間的通信問題。普通Queue實現不了。例如來跑多進程對一批IP列表進行運算,運算後的結果都存到Queue隊列裡面,這個就必須使用multiprocessing提供的Queue來實現

10. python 多queue有什麼好處

死鎖通常是因為你使用了鎖。 在python里可以直接使用Queue,它自帶了鎖。你不需要自己設置一個鎖。

所以嚴格來說,在python中,不需要鎖。如果用到了鎖,特別是多線程處理。要採用隊列方式去解決,就沒有這個問題了。

如果一定要用鎖就存在死鎖的情形。比如一個鎖依賴另一個鎖,在某種情形下,兩者都打不開。特別是多線程的時候。

通常我們的辦法是,在線程里設置一個心跳變數。在主線程里檢查這個變數。如果一個線程長時間心跳停止 ,應該是死了。死鎖也包括在內。

熱點內容
vs引入文件夾 發布:2025-02-13 22:05:52 瀏覽:126
安卓手機如何調無限電量 發布:2025-02-13 22:05:50 瀏覽:112
phppost長度 發布:2025-02-13 22:05:45 瀏覽:625
烈火戰神源碼 發布:2025-02-13 22:04:51 瀏覽:618
源碼貓交易 發布:2025-02-13 22:04:49 瀏覽:755
廣告腳本鏡頭 發布:2025-02-13 22:04:48 瀏覽:985
安卓手機哪個app自拍更真實 發布:2025-02-13 22:00:19 瀏覽:193
安卓系統密碼忘了怎麼辦 發布:2025-02-13 21:49:28 瀏覽:971
找回密碼發送信息是什麼意思 發布:2025-02-13 21:49:26 瀏覽:639
織夢通用源碼 發布:2025-02-13 21:48:41 瀏覽:438