1. 程式人生 > >python多執行緒程式設計之Queue---put/get 方法的阻塞

python多執行緒程式設計之Queue---put/get 方法的阻塞

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

1. 阻塞模式導致資料汙染

import Queue
       q = Queue.Queue(10)
       for i in range(10):
               myData = 'A'
               q.put(myData)
               myData = 'B'

這是一段極其簡單的程式碼,但我總是不能獲得期望的結果(期望在佇列中寫入10個A,卻總是混雜了B)。原來,Queue.put()預設有 block = True 和 timeou 兩個引數。當  block = True 時,寫入是阻塞式的,阻塞時間由 timeou  確定

。正因為阻塞,才導致了後來的賦值汙染了處於阻塞狀態的資料。Queue.put()方法加上 block=False 的引數,即可解決這個隱蔽的問題。但要注意,非阻塞方式寫佇列,當佇列滿時會丟擲 exception Queue.Full 的異常。

2. 無法捕獲 exception Queue.Empty 的異常

while True:
                ......
                try:
                        data = q.get()
                except Queue.Empty:
                        break

我的本意是用佇列為空時,退出迴圈,但實際執行起來,卻陷入了死迴圈。這個問題和上面有點類似:Queue.get()預設的也是阻塞方式讀取資料,佇列為空時,不會丟擲 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的引數,問題迎刃而解。

3. Queue常用方法彙總

Queue.Queue(maxsize=0)   FIFO, 如果maxsize小於1就表示佇列長度無限
       Queue.LifoQueue(maxsize=0)   LIFO, 如果maxsize小於1就表示佇列長度無限
       Queue.qsize()   返回佇列的大小 
       Queue.empty()   如果佇列為空,返回True,反之False 
       Queue.full()   如果佇列滿了,返回True,反之False
       Queue.get([block[, timeout]])   讀佇列,timeout等待時間 
       Queue.put(item, [block[, timeout]])   寫佇列,timeout等待時間 
       Queue.queue.clear()   清空佇列

相關推薦

python執行程式設計Queue---put/get 方法阻塞

python 中,佇列是執行緒間最常用的交換資料的形式。Queue模組是提供佇列操作的模組,雖然簡單易用,但是不小心的話,還是會出現一些意外。 1. 阻塞模式導致資料汙染 import Queue        q = Queue.Queue(10)        for

[python] 專題八.執行程式設計thread和threading

        就個人而言,學了這麼多年的課程又寫了這麼多年的程式,雖然沒有涉及到企業級的專案,但還是體會到了有幾個知識點是非常重要的,包括:面向物件的思想、如何架構一個專案、設計模式來具體解決問題、應用機器學習和深度學習的方法,當然也包括我這篇文章的內容——多執行緒和並行

PYTHON——執行:佇列Queue資料結構

1、佇列模組簡介   佇列是一種資料結構,用於存放資料,類似列表。它是先進先出模式(FIFO模式),類似管道一般; 單執行緒不需要用到佇列Queue,它主要用在多執行緒之間的,Queue稱為多執行緒利器。 列表在多執行緒共享資源的話,與queue佇列比較,主要表現為列表在多執行緒中,資料不安全。多個執行

java執行程式設計使用Synchronized塊同步變數

通過synchronized塊來同步特定的靜態或非靜態方法。 要想實現這種需求必須為這些特性的方法定義一個類變數,然後將這些方法的程式碼用synchronized塊括起來,並將這個類變數作為引數傳入synchronized塊   下面的程式碼演示瞭如何同步特定的類方法:

執行程式設計Runnable與Callable區別

Runnable @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used

Python執行程式設計,執行

1 2 3 from threading import Thread 4 import time 5 ​ 6 class MyThread(Thread): 7 name1 = 'MyThread-1' 8 def __init__(self,target,args

Python執行程式設計,執行鎖,以及補充上一篇程序文章

程序補充 程序間的訊號 訊號是唯一的非同步通訊方法 一個程序向另一個程序傳送一個訊號來傳遞某種資訊,接受者根據傳遞的資訊來做相應的事 $ kill -l檢視系統訊號說明 $ kill -9 pid號對程序傳送訊號 訊號名稱 說明

Python執行程式設計

#!/usr/bin/python #!coding=utf-8 import threading import time exitFlag = 0 class MyThread(threading.Thread): def __init__(self, threadID, name, counte

談談python執行程式設計

談談python多執行緒程式設計 Python中GIL概念 Python(CPython)不是執行緒安全的,所以我們需要一個GIL(Global interpreter Lock),來保證資料完性和安全性。也就是同一時間內同一核CPU中只能有一個GIL。 Threading的GI

執行程式設計執行基礎

前言 此內容是閱讀了書籍《JAVA多執行緒程式設計核心技術》後作為學習總結的文章,同時也梳理一下內容。建議大家有興趣都可以閱讀一下這本書,對於想了解更多的同學來說是一個很好的教材,同時建議大家多去思考和動手編寫程式碼,融會貫通之後再去看一遍,會有更多的體會。就比如《JVM底層實現最佳實戰》的書籍一樣,我讀了

孤荷凌寒自學python第四十三天python執行同步Queue物件

 孤荷凌寒自學python第四十三天python的執行緒同步之Queue物件   (完整學習過程螢幕記錄視訊地址在文末,手寫筆記在文末) Queue物件是直接操作佇列池的物件,佇列中可以存放多種物件,當然也就可以存放執行緒物件,將多個執行緒物件存放於佇列池中之後,就能非常顯式的

執行程式設計synchronized和Lock

前言 在高併發多執行緒應用場景中對於synchronized和Lock的使用是很普遍的,這篇文章我們就來進行這些知識點的學習,比如說:公平鎖與非公平鎖、樂觀鎖與悲觀鎖、執行緒間通訊、讀寫鎖、資料髒讀等知識內容。目錄:1.同步問題的產生與案例程式碼2.synchronized解決同步問題3.Lock解決同步程

Python執行python執行設計同時執行個函式命令詳細攻略

Python之多執行緒:python多執行緒設計之同時執行多個函式命令詳細攻略 目的 同時執行多個函式命令   採取方法 T1、單個實現 import threading threading.Thread(target=my_record()).start(

Android 執行程式設計 HandlerThread 詳解

    HandlerThread有那些特點: HandlerThread本質上是一個執行緒類,它繼承了Thread; HandlerThread有自己的內部Looper物件,可以進行looper迴圈; 通過獲取HandlerThread的looper物件傳

Linux執行程式設計員工資訊管理系統

       員工資訊管理系統是基於Linux 多執行緒併發伺服器程式設計,由伺服器端和客戶端構成,客戶端可以執行在多個不同的主機上連線伺服器,伺服器對員工資訊的操作結果通過“員工資訊檔案”來儲存,即:“員工資訊”存放在後臺的檔案中,相當於資料庫。當用戶登入後,根據使用者名稱

java執行程式設計優先順序

高優先順序的執行緒總是大部分先執行完,但是不是所有的先執行完。先執行完也不是因為先呼叫,如果更改優先順序,先執行完和和程式碼的呼叫順序無關。 優先順序具有一定的規則性,CPU總是儘量將執行資源讓給優先順序比較高的執行緒 優先順序較高的執行緒不一定每一次都先執行完 package com.

java執行程式設計讀寫鎖設計高效能快取器

解決多執行緒執行緒安全問題的主要方法是通過加鎖的方式來實現,當多個執行緒對某個變數進行讀取或寫入的時候通過加鎖來限定只有當前獲取鎖許可權的執行緒才可以對資料進行讀寫,當該執行緒訪問完畢釋放鎖之後其他阻

java 執行程式設計join()的用法

join的用法,先看幾個例子在說。 程式1: public class ThreadTest implements Runnable {  public static int a = 0;  public synchronized void inc() {   a+

Python執行3:queue

queue模組實現了多生產者,多消費者佇列。在多執行緒環境下,該佇列能實現多個執行緒間安全的資訊交換。 queue模組介紹 模組實現了3種類型的佇列,區別在於佇列中條目檢索的順序不同。在FIFO佇列中,按照先進先出的順序檢索條目。在LIFO佇列中,最後新增的條目最先檢索到(

java執行程式設計連續列印abc的幾種解法

java多執行緒程式設計之連續列印abc的解法 一道程式設計題如下: 例項化三個執行緒,一個執行緒列印a,一個執行緒列印b,一個執行緒列印c,三個執行緒同時執行,要求打印出10個連著的abc。 題目分析: 通過題意我們可以得出,本題需要我們使用三個執行緒