簡體   English   中英

同時進行多個流程

[英]More than one process at the same time

嘿,我現在正在學習Python。 我寫了一些程序。 現在我有一個問題:是否可以一次運行更多的“操作”? 據我所知,腳本是從上到下運行的(除了像def和if語句之類的東西)。


例如:我想做某事,然后等待5秒鍾,然后繼續,但是當我的程序“等待”時,它應該做其他事嗎? (這很簡單)或者:在檢查輸入時執行其他輸出操作。

這些例子非常糟糕,但我目前還沒有發現更好的例子。 (如果有什么想法,我稍后再補充)。希望您理解我的問題。

干杯

TL; DR:使用異步方法。 雷蒙德·海廷格(Raymond Hettinger)是位上帝, 這次演講比我能更准確,更徹底地解釋這個概念。 ;)

您描述的行為稱為“並發性”或“異步性”,其中您有多個“同時”執行的“一段”代碼。 這是實用計算機科學中最難解決的問題之一,因為增加時間的維數不僅會導致邏輯問題,還會導致調度問題。 但是,由於多核處理器和互聯網固有的並行環境,近來需求很大

用引號引起“同時”,因為有兩種基本方法可以實現此目的:

  1. 實際在同一時間運行代碼
  2. 使它看起來像在同時運行。

第一個選項稱為並發編程,第二個選項稱為異步編程(通常為“異步”)。

通常,“現代”編程似乎更喜歡異步,因為它更易於推理,並且陷阱更少,不太嚴重。 如果操作正確,異步程序可能看起來很像您已經熟悉的同步過程代碼。 Golang基本上是基於該概念構建的。 Javascript以Promises和async / await的形式接受了“未來”。 我知道它不是Python,但是Go的創建者的演講很好地概述了這一哲學。

Python提供了三種主要的處理方式,分為三個主要模塊: threadingmultiprocessingasyncio

多處理線程是並發解決方案。 它們做的事情非常相似,但是通過以不同的方式委派給操作系統以不同的方式完成它們。 這個答案有一個簡潔的解釋。 眾所周知,並發性很難調試,因為它不是確定性的 :時間上的微小差異會導致完全不同的執行順序。 您還必須處理線程中的“競爭條件”,其中兩位代碼要同時讀取/更改相同的共享狀態。

asyncio或“異步輸入輸出”是一種較新的異步解決方案。 您至少需要Python 3.4。 它使用事件循環來執行長時間運行的任務,而不會“阻塞”程序的其余部分。 進程和線程做類似的事情,通過周期性地中斷正在運行的進程,迫使它們輪流在同一處理器內核上運行兩個或多個操作。 但是通過異步, 您可以決定轉彎發生的位置。 這就像設計一個可以互動的成熟成年人,而不是設計必須由OS照看並被迫共享處理器的幼稚園。

還有一些第三方軟件包,例如geventeventlet ,它們早於asyncio並可以在Python的早期版本中使用。 如果您有能力將Python設置為> = 3.4,我建議您僅使用asyncio ,因為它是Python核心的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM