python3.5中,佇列是執行緒間最常用的交換資料的形式。queue模組是提供佇列操作的模組,雖然簡單易用,但是不小心的話,還是會出現一些意外。
import queue
q = queue.queue( maxsize=
10)
queue.queue
類即是乙個佇列的同步實現。佇列長度可為無限或者有限。可通過queue
的建構函式的可選引數maxsize
來設定佇列長度。如果maxsize
小於1
就表示佇列長度無限。
q.put(
10)
呼叫佇列物件的put()
方法在隊尾插入乙個專案。
put( item, block=1)
有兩個引數:
如果佇列當前為空且block
為1
,put()
方法就使呼叫執行緒暫停,直到空出乙個資料單元。
如果block
為0
,put
方法將引發full
異常。
q.get( timeout=
5)
呼叫佇列物件的get()
方法從隊頭刪除並返回乙個專案。
可選引數為block
,預設為true
。
如果隊列為空且block
為true
,get()
就使呼叫執行緒暫停,直至有專案可用。
如果隊列為空且block
為false
,佇列將引發empty
異常。
# python queue模組的fifo佇列先進先出。
class
queue
.queue( maxsize)
#lifo類似於堆,即先進後出。
class
queue
.lifoqueue( maxsize)
#還有一種是優先順序佇列級別越低越先出來
class
queue
.priorityqueue( maxsize)
# ./queued.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os, random, time
import queue
from multiprocessing.managers import basemanager
task_queue= queue.queue(
)class
queuemanager
( basemanager)
:pass
if __name__ ==
'__main__'
:# 將queue註冊到網路上,callable引數關聯了queue物件
queuemanager.register(
"task_queue"
,callable
=lambda
:task_queue)
# 注意 authkey=b'task' 網路編碼:一定要 bytes 物件
manager = queuemanager( address=
("192.168.218.123"
,19911
), authkey=b'task'
) manager.start(
) manager.join(
)
啟動佇列服務:
nohup ./queued.py &
# ./a.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os, random, time
import queue
from multiprocessing.managers import basemanager
class
queuemanager
( basemanager)
:pass
if __name__ ==
'__main__'
:# 將queue註冊到網路上,callable引數關聯了queue物件
queuemanager.register(
"task_queue"
) manager = queuemanager( address=
("192.168.218.123"
,19911
), authkey=b'task'
) manager.connect(
) task_queue = manager.task_queue(
)while
true
: n = random.randint(0,
1000
)print
('put task %d ...'
% n)
task_queue.put(n)
time.sleep(
1)
# ./b.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os, random
import queue
from multiprocessing.managers import basemanager
class
queuemanager
( basemanager)
:pass
if __name__ ==
'__main__'
:# 將queue註冊到網路上,callable引數關聯了queue物件
queuemanager.register(
"task_queue"
) manager = queuemanager( address=
("192.168.218.123"
,19911
), authkey=b'task'
) manager.connect(
) task_queue = manager.task_queue(
)while
true
:# 當 queue.empty, get 會出現超時情況,需要做異常處理。
try:
n = task_queue.get( timeout=10)
except exception:
n =none
print
("run task {}"
.format
( n)
)if n is
none
: time.sleep(5)
print
('sleep 5 s...'
)
python網路程式設計之執行緒佇列 queue
首先來看乙個示例 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 thre...
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...