Python網路程式設計之執行緒佇列 queue

2021-09-28 16:13:38 字數 3695 閱讀 8427

python3.5中,佇列是執行緒間最常用的交換資料的形式。queue模組是提供佇列操作的模組,雖然簡單易用,但是不小心的話,還是會出現一些意外。

import queue

q = queue.queue( maxsize=

10)

queue.queue類即是乙個佇列的同步實現。佇列長度可為無限或者有限。可通過queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。

q.put(

10)

呼叫佇列物件的put()方法在隊尾插入乙個專案。

put( item, block=1)有兩個引數:

如果佇列當前為空且block1put()方法就使呼叫執行緒暫停,直到空出乙個資料單元。

如果block0put方法將引發full異常。

q.get( timeout=

5)

呼叫佇列物件的get()方法從隊頭刪除並返回乙個專案。

可選引數為block,預設為true

如果隊列為空且blocktrueget()就使呼叫執行緒暫停,直至有專案可用。

如果隊列為空且blockfalse,佇列將引發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...