導航:首頁 > 編程語言 > 事務隊列Python

事務隊列Python

發布時間:2023-12-10 01:12:37

python數據結構-隊列與廣度優先搜索(Queue)

隊列(Queue) :簡稱為隊,一種線性表數據結構,是一種只允許在表的一端進行插入操作,而在表的另一端進行刪除操作的線性表。
我們把隊列中允許插入的一端稱為 「隊尾(rear)」 ;把允許刪除的另一端稱為 「隊頭(front)」 。當表中沒有任何數據元素時,稱之為 「空隊」

廣度優先搜索演算法(Breadth First Search) :簡稱為 BFS,又譯作寬度優先搜索 / 橫向優先搜索。是一種用於遍歷或搜索樹或圖的演算法。該演算法從根節點開始,沿著樹的寬度遍歷樹或圖的節點。如果所有節點均被訪問,則演算法中止。

廣度優先遍歷 類似於樹的層次遍歷過程 。呈現出一層一層向外擴張的特點。先看到的節點先訪問,後看到的節點後訪問。遍歷到的節點順序符合「先進先出」的特點,所以廣度優先搜索可以通過「隊列」來實現。

力扣933

游戲時,隊首始終是持有土豆的人
模擬游戲開始,隊首的人出隊,之後再到隊尾(類似於循環隊列)
傳遞了num次之後,將隊首的人移除
如此反復,直到隊列中剩餘一人

多人共用一台列印機,採取「先到先服務」的隊列策略來執行列印任務
需要解決的問題:1 列印系統的容量是多少?2 在能夠接受的等待時間內,系統可容納多少用戶以多高的頻率提交列印任務?

輸入:abba
輸出:False
思路:1 先將需要判定的詞從隊尾加入 deque; 2從兩端同時移除字元並判斷是否相同,直到deque中剩餘0個(偶數)或1個字元(奇數)

內容參考: https://algo.itcharge.cn/04.%E9%98%9F%E5%88%97/01.%E9%98%9F%E5%88%97%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01.%E9%98%9F%E5%88%97%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/

⑵ python入門需要學哪些

初學者學習Python需循序漸進,可以從以下內容入手學習:

1.Python基礎知識

學習任何一門編程語言都需要學習相關語法知識,Python基礎知識的學習主要包括Python解釋器執行原理、字元編碼、注釋、變數、縮進、流程式控制制、文件操作、數據類型、數據類型內置方法、字元串格式化、運算符、輸入輸出、三元運算、collections、列表、字典、元組、集合、IO操作、文件增刪改查、函數等。

5.資料庫、緩存、隊列

Python資料庫、緩存、隊列學習內容為Python操作redis、Python操作memcache、rabbitMQ消息隊列、資料庫介紹、mysql資料庫安裝使用、mysql管理、mysql數據類型、常用mysql命令、創建資料庫、外鍵、增刪改查表、許可權、事務、索引、Python操作mysql等。

6.Web開發基礎

Python之Web開發基礎學習內容為HTML基礎、CSS基礎、JavaScript基礎、局部變數和全局變數、集合、數組、字典、函數參數、原型、面向對象、作用域、dom編程、jquery介紹、jquery選擇器、jquery屬性和CSS操作、jquery文檔處理、jquery篩選、jquery事件託管、jquery事件、jquery ajax、jquery擴展方法、bootstrap使用、EasyUI介紹和使用等。

7.Web框架學習

Python之Web框架學習內容為Web框架本質、socket伺服器、基於反射的路由系統、WSGI介凱閉行紹及原理實現態御、開發自己的Web框架、MVC和MTV、路由系統、模板、django基礎學習與使用、普通路由和動態路由、模板引擎、ORM介紹、Django ORM增刪改查學習、自定義tag、django進階學習與使用、模型綁定、Form表單驗證、Django ORM進階學習、ModelForm、自定義Validator等。

⑶ Python 非同步任務隊列Celery 使用

在 Python 中定義 Celery 的時候,我們要引入 Broker,中文翻譯過來就是「中間人」的意思。在工頭(生產者)提出任務的時候,把所有的任務放到 Broker 裡面,在 Broker 的另外一頭,一群碼農(消費者)等著取出一個個任務准備著手做。這種模式註定了整個系統會是個開環系統,工頭對於碼農們把任務做的怎樣是不知情的。所以我們要引入 Backend 來保存每次任務的結果。這個 Backend 也是存儲任務的信息用的,只不過這里存的是那些任務的返回結果。我們可以選擇只讓錯誤執行的任務返回結果到 Backend,這樣我們取回結果,便可以知道有多少任務執行失敗了。

其實現架構如下圖所示:

可以看到,Celery 主要包含以下幾個模塊:

celery可以通過pip自動安裝。

broker 可選擇使用RabbitMQ/redis,backend可選擇使用RabbitMQ/redis/MongoDB。RabbitMQ/redis/mongoDB的安裝請參考對應的官方文檔。

------------------------------rabbitmq相關----------------------------------------------------------

官網安裝方法: http://www.rabbitmq.com/install-windows.html

啟動管理插件:sbin/rabbitmq-plugins enable rabbitmq_management 啟動rabbitmq:sbin/rabbitmq-server -detached

rabbitmq已經啟動,可以打開頁面來看看 地址: http://localhost:15672/#/

用戶名密碼都是guest 。進入可以看到具體頁面。 關於rabbitmq的配置,網上很多 自己去搜以下就ok了。

------------------------------rabbitmq相關--------------------------------------------------------

項目結構如下:

使用前,需要三個方面:celery配置,celery實例,需執行的任務函數,如下:

Celery 的配置比較多,可以在 官方配置文檔: http://docs.celeryproject.org/en/latest/userguide/configuration.html 查詢每個配置項的含義。

當然,要保證上述非同步任務and下述定時任務都能正常執行,就需要先啟動celery worker,啟動命令行如下:

啟動beat ,執行定時任務時, Celery會通過celery beat進程來完成。Celery beat會保持運行, 一旦到了某一定時任務需要執行時, Celery beat便將其加入到queue中. 不像worker進程, Celery beat只需要一個即可。而且為了避免有重復的任務被發送出去,所以Celery beat僅能有一個。

命令行啟動:

如果你想將celery worker/beat要放到後台運行,推薦可以扔給supervisor。

supervisor.conf如下:

⑷ Python實現簡單多線程任務隊列

Python實現簡單多線程任務隊列
最近我在用梯度下降演算法繪制神經網路的數據時,遇到了一些演算法性能的問題。梯度下降演算法的代碼如下(偽代碼):
defgradient_descent(): # the gradient descent code plotly.write(X, Y)
一般來說,當網路請求 plot.ly 繪圖時會阻塞等待返回,於是也會影響到其他的梯度下降函數的執行速度。
一種解決辦法是每調用一次 plotly.write 函數就開啟一個新的線程,但是這種方法感覺不是很好。 我不想用一個像 cerely(一種分布式任務隊列)一樣大而全的任務隊列框架,因為框架對於我的這點需求來說太重了,並且我的繪圖也並不需要 redis 來持久化數據。
那用什麼辦法解決呢?我在 python 中寫了一個很小的任務隊列,它可以在一個單獨的線程中調用 plotly.write函數。下面是程序代碼。
classTaskQueue(Queue.Queue):
首先我們繼承 Queue.Queue 類。從 Queue.Queue 類可以繼承 get 和 put 方法,以及隊列的行為。
def__init__(self, num_workers=1): Queue.Queue.__init__(self) self.num_workers=num_workers self.start_workers()
初始化的時候,我們可以不用考慮工作線程的數量。
defadd_task(self, task,*args,**kwargs): args=argsor() kwargs=kwargsor{} self.put((task, args, kwargs))
我們把 task, args, kwargs 以元組的形式存儲在隊列中。*args 可以傳遞數量不等的參數,**kwargs 可以傳遞命名參數。
defstart_workers(self): foriinrange(self.num_workers): t=Thread(target=self.worker) t.daemon=True t.start()
我們為每個 worker 創建一個線程,然後在後台刪除。
下面是 worker 函數的代碼:
defworker(self): whileTrue: tupl=self.get() item, args, kwargs=self.get() item(*args,**kwargs) self.task_done()
worker 函數獲取隊列頂端的任務,並根據輸入參數運行,除此之外,沒有其他的功能。下面是隊列的代碼:
我們可以通過下面的代碼測試:
defblokkah(*args,**kwargs): time.sleep(5) print「Blokkah mofo!」 q=TaskQueue(num_workers=5) foriteminrange(1): q.add_task(blokkah) q.join()# wait for all the tasks to finish. print「Alldone!」
Blokkah 是我們要做的任務名稱。隊列已經緩存在內存中,並且沒有執行很多任務。下面的步驟是把主隊列當做單獨的進程來運行,這樣主程序退出以及執行資料庫持久化時,隊列任務不會停止運行。但是這個例子很好地展示了如何從一個很簡單的小任務寫成像工作隊列這樣復雜的程序。
defgradient_descent(): # the gradient descent code queue.add_task(plotly.write, x=X, y=Y)
修改之後,我的梯度下降演算法工作效率似乎更高了。如果你很感興趣的話,可以參考下面的代碼。 classTaskQueue(Queue.Queue): def__init__(self, num_workers=1):Queue.Queue.__init__(self)self.num_workers=num_workersself.start_workers() defadd_task(self, task,*args,**kwargs):args=argsor()kwargs=kwargsor{}self.put((task, args, kwargs)) defstart_workers(self):foriinrange(self.num_workers):t=Thread(target=self.worker)t.daemon=Truet.start() defworker(self):whileTrue:tupl=self.get()item, args, kwargs=self.get()item(*args,**kwargs)self.task_done() deftests():defblokkah(*args,**kwargs):time.sleep(5)print"Blokkah mofo!" q=TaskQueue(num_workers=5) foriteminrange(10):q.add_task(blokkah) q.join()# block until all tasks are doneprint"All done!" if__name__=="__main__":tests()

⑸ Python Queue 入門

Queue 叫隊列,是數據結構中的一種,基本上所有成熟的編程語言都內置了對 Queue 的支持。

Python 中的 Queue 模塊實現了多生產者和多消費者模型,當需要在多線程編程中非常實用。而且該模塊中的 Queue 類實現了鎖原語,不需要再考慮多線程安全問題。

該模塊內置了三種類型的 Queue,分別是 class queue.Queue(maxsize=0) , class queue.LifoQueue(maxsize=0) 和 class queue.PriorityQueue(maxsize=0) 。它們三個的區別僅僅是取出時的順序不一致而已。

Queue 是一個 FIFO 隊列,任務按照添加的順序被取出。

LifoQueue 是一個 LIFO 隊列,類雀指似堆棧,後添加的任務先被取出。

PriorityQueue 是一個優先順序隊列,隊列裡面的肆歲友任務按照優先順序排序,優先順序高的先被取出。

如你所見,就是上面所說的三種不同類型的內置隊列,其中 maxsize 是個整數,用於設置可以放入隊列中的任務數的上限。當達到這個大小的時候,插入操作將阻塞至隊列中的任務被消費掉。如果 maxsize 小於等於零,則隊列尺寸為無限大。

向隊列中添加任務,直接調用 put() 函數即可

put() 函數完整的函數簽名如下 Queue.put(item, block=True, timeout=None) ,如你所見,該函數有兩個可選參數。

默認情況下,在隊列滿時,該函數會一直阻塞,直到隊列中有空餘的位置可以添加任務為止。如果 timeout 是正數,則最多阻塞 timeout 秒,如果這段時間內還沒有空餘的位置出來,則會引發 Full 異常。

當 block 為 false 時,timeout 參數將失效。同時如果隊列中沒有空餘的位置可添加任務則會引發 Full 異常,否則會直接把任務放入隊列並返回,不會阻塞。

另外,還可以通過 Queue.put_nowait(item) 來添加任務,相當於 Queue.put(item, False) ,不再贅述。同樣,在隊列滿時,該操作會引發 Full 異常。

從隊列中獲取任務,直接調用 get() 函數即可。

與 put() 函數一樣, get() 函數也有兩個可選參數,完整簽名如下 Queue.get(block=True, timeout=None) 。

默認情況下,當隊列空時調用該函數會一直阻塞,直到隊列中有任務可獲取為止。如果 timeout 是正數,則最多阻塞 timeout 秒,如果這段時間內還沒有任務可獲取,則會引發 Empty 異常。

當 block 為 false 時,timeout 參數將失效。同時如果隊列中沒有任務可獲取則會立刻引發 Empty 異常,否則會直接獲取一個任務並返回,不會阻塞。

另外,還可以通過 Queue.get_nowait() 來獲取任務,相當於 Queue.get(False) ,不再贅述。同裂槐樣,在隊列為空時,該操作會引發 Empty 異常。

Queue.qsize() 函數返回隊列的大小。注意這個大小不是精確的,qsize() > 0 不保證後續的 get() 不被阻塞,同樣 qsize() < maxsize 也不保證 put() 不被阻塞。

如果隊列為空,返回 True ,否則返回 False 。如果 empty() 返回 True ,不保證後續調用的 put() 不被阻塞。類似的,如果 empty() 返回 False ,也不保證後續調用的 get() 不被阻塞。

如果隊列是滿的返回 True ,否則返回 False 。如果 full() 返回 True 不保證後續調用的 get() 不被阻塞。類似的,如果 full() 返回 False 也不保證後續調用的 put() 不被阻塞。

queue.Queue() 是 FIFO 隊列,出隊順序跟入隊順序是一致的。

queue.LifoQueue() 是 LIFO 隊列,出隊順序跟入隊順序是完全相反的,類似於棧。

優先順序隊列中的任務順序跟放入時的順序是無關的,而是按照任務的大小來排序,最小值先被取出。那任務比較大小的規則是怎麼樣的呢。

注意,因為列表的比較對規則是按照下標順序來比較的,所以在沒有比較出大小之前 ,隊列中所有列表對應下標位置的元素類型要一致。

好比 [2,1] 和 ["1","b"] 因為第一個位置的元素類型不一樣,所以是沒有辦法比較大小的,所以也就放入不了優先順序隊列。

然而對於 [2,1] 和 [1,"b"] 來說即使第二個元素的類型不一致也是可以放入優先順序隊列的,因為只需要比較第一個位置元素的大小就可以比較出結果了,就不需要比較第二個位置元素的大小了。

但是對於 [2,1] 和 1 [2,"b"] 來說,則同樣不可以放入優先順序隊列,因為需要比較第二個位置的元素才可以比較出結果,然而第二個位置的元素類型是不一致的,無法比較大小。

綜上,也就是說, 直到在比較出結果之前,對應下標位置的元素類型都是需要一致的

下面我們自定義一個動物類型,希望按照年齡大小來做優先順序排序。年齡越小優先順序越高。

本章節介紹了隊列以及其常用操作。因為隊列默認實現了鎖原語,因此在多線程編程中就不需要再考慮多線程安全問題了,對於程序員來說相當友好了。

⑹ 沒學過Python先要學習哪些基礎知識

或看好Python的廣闊前景,或看中Python的語法簡潔,越來越多零基礎的人選擇學Python。但是Python基礎知識有哪些呢?Python部分基礎知識點匯總
數據類型:編程中操作的每一個數據都是有其類型的,比如我們的程序需要進行數學計算,那麼進行計算的參數和結果就都是數值,我們需要輸入、輸出一段話,那麼這段話就是一個字元串。

變數和常量:變數有什麼用?怎麼使用?常量又是做什麼的?

控制流語句:控制流語句讓程序變得更加靈活,稍微復雜一些的程序都需要用到控制流語句中的判斷和循環,那麼如何在Python中高效應用控制流語句就顯得非常重要。

函數:當程序開始復雜起來,某些功能可能需要多次使用的時候,我們就可以把這個功能封裝成「函數」,函數就像是工具箱里一件件的工具,在需要的時候打開工具箱拿出即可使用。

數據結構:Python怎麼處理數據?列表、元組、集合、字典分別有什麼特性都需要詳細了解。

異常處理:當你的程序開始復雜起來,可能會遇到某些不確定是否會出現錯誤的情況,這個時候怎樣自定義異常、處理異常就十分重要。

注釋:不寫注釋的程序員不是好程序員。

面向對象:面向對象是一種編程思想,可以讓程序變得更可復用,同時邏輯更清晰,效率最高。

文件操作:很多時候我們需要對本地文件進行一些增刪改查的操作。

模塊和包:Python之所以如此受歡迎,很大程度上得益於它有非常豐富模塊和包,這些東西可以讓你少造輪子。

Python與網路:python獲取網頁信息、與其他計算機通信、訪問資料庫等。

以上大部分其實是編程基礎,但是只學這些還是不夠的,很多企業招聘的Python崗位均需要和其他方向內容相結合,比如大數據、運維、Web等等。因此零基礎快速入門進階Python技能還需要進行系統的學習。

閱讀全文

與事務隊列Python相關的資料

熱點內容
雙程2 | 雙程機票:便捷的旅行選擇 瀏覽:578
聯想伺服器如何組建raid0 瀏覽:329
免費看大黃:網路視頻的付費與免費觀看之爭 瀏覽:162
秦大爺第一次上葉思佳的經歷和感受 瀏覽:566
康強:如何提高身體的健康指數 瀏覽:15
程序員上了一年班也沒有提升 瀏覽:202
java繼承重寫 瀏覽:789
各國程序員網址 瀏覽:251
黑暗聖經12集無刪減帶字幕:解讀與影響 瀏覽:933
美麗小蜜桃2:優點、使用技巧和最新版本介紹 瀏覽:477
自助電瓶車app是什麼 瀏覽:986
量子線源碼怎麼看 瀏覽:135
sp打法 | SP打法:提升游戲競技優勢的戰術策略 瀏覽:896
powermill編程好學嗎 瀏覽:892
朱門綉戶紅燒肉明珠 瀏覽:471
事在人為:努力與行動的力量 瀏覽:369
macd背離源碼 瀏覽:812