首先來看乙個示例:
import threading
import time
li = [1,2,3,4,5]
defpri
():while li:
a = li[-1]
print(a)
time.sleep(1)
try:
li.remove(a)
except exception as e:
print('------',a,e)
t1 = threading.thread(target=pri)
t1.start()
t2 = threading.thread(target=pri)
t2.start()
執行結果:
5 5
4 —— 5 list.remove(x): x not in list
4 3
—— 4 list.remove(x): x not in list
3 2
—— 3 list.remove(x): x not in list
2 1
—— 2 list.remove(x): x not in list
1 —— 1 list.remove(x): x not in list
上面的示例說明了乙個問題,在多執行緒中列表是不安全的,當然解決這個問題也可以通過加鎖來實現,但如果不用鎖,該怎麼辦呢?這時候就用到了佇列的概念。
多執行緒佇列:
import queue #執行緒佇列
l =
q = queue.queue(3)# fifo
q.put(11)
q.put('hello')
q.put()
q.put(34)
while
1: data = q.get()
print(data)
執行結果:
11 hello
佇列有三種形式,預設是先進先出,就像上面一樣。
佇列(先進後出):
#先進後出lifo
import queue
q = queue.lifoqueue()
q.put(11)
q.put('hello')
q.put()
q.put(34)
while
1: data = q.get()
print(data)
執行結果:
34
hello
11佇列(優先順序):
#優先順序
import queue
q = queue.priorityqueue()
q.put([3,11])
q.put([2,'hello'])
q.put([4,])
while
1: data = q.get()
print(data)
執行結果:
[2, 『hello』]
[3, 11]
[4, ]
Python網路程式設計之執行緒佇列 queue
python3.5中,佇列是執行緒間最常用的交換資料的形式。queue模組是提供佇列操作的模組,雖然簡單易用,但是不小心的話,還是會出現一些意外。import queue q queue.queue maxsize 10 queue.queue類即是乙個佇列的同步實現。佇列長度可為無限或者有限。可通...
python網路程式設計之單執行緒之間的併發
單執行緒之間的併發就是利用乙個執行緒實現併發的效果,也就是利用了cup遇到阻塞的那段時間去做別的事情,從而提高了cup的利用率,使之在單個執行緒中就實現了併發的效果。下面就是乙個簡單的服務端單個執行緒實現併發的 from socket import server socket af inet,soc...
Python網路程式設計之UDP
udp處理資料報,是一種無連線的協議 伺服器端 server socket.socket socket.af inet,socket.sock dgram 繫結ip server.bind 192.168.1.104 221 while true 接收 data,address server.rec...