簡體   English   中英

如何在python上同時運行兩個線程?

[英]How to run two threads at the same time at python?

我已經閱讀了主題,但是當我嘗試運行此代碼時,我會稍微

import threading
from threading import Thread
from cryptography.fernet import Fernet
import time
from multiprocessing import Process



def create_key1():

    print(time.time())


def create_key2(): 

    print(time.time())  

if __name__ == '__main__':
    Process(target = create_key1()).start()
    Process(target = create_key2()).start()

    Thread(target = create_key1()).start()
    Thread(target = create_key2()).start()

如果我們注釋Process並運行代碼,我們將看到結果:

1501843580.508508
1501843580.5089302

如果我們注釋線程並運行代碼,我們將看到結果:

1501843680.4178944
1501843680.420028

我們在相同情況下遇到了增量問題,我的問題是如何同時運行線程,因為我想檢查密碼python庫中密鑰的生成。 我想檢查一下,如果我嘗試同時生成兩個密鑰,它們是否相同,該怎么辦?

與您的代碼中一樣,對兩個函數的並行處理不能保證這些函數將在完全相同的時間運行。 如您所見,方法到達time.time()調用的時間略有差異,這是可以預期的。

特別是由於threading模塊的設計方式,方法不可能完全同時運行。 類似地,盡管理論上multiprocessing模塊可以同時精確地運行兩個功能,但不能保證這一點,而且這種情況很少發生。

最后,這與操作系統的低級限制相抵觸,在操作系統中,無法在同一處理內核上同時運行兩個代碼。

要回答有關這將如何影響代碼產生的鍵的問題,這取決於算法對當前時間的敏感程度。 如果您的算法將當前時間的密鑰基於最近的秒或十分之一秒,則生成的密鑰可能會相同(但不能保證是相同的)。 但是,如果生成的鍵基於到達函數調用的確切時間,則它們不可能匹配,因為不能保證兩個函數中到達函數調用的時間。

有關threadingmultiprocessing模塊之間差異的更多信息,請參見this

GIL是解釋程序級別的鎖。 此鎖可防止在Python解釋器中一次執行多個線程。 每個要運行的線程都必須等待另一個線程釋放GIL,這意味着您的多線程Python應用程序本質上是單線程的,

另一種方法是使用多處理模塊,其中每個進程都使用自己的Python運行時在其自己的OS進程中運行。 通過這種方法,您可以充分利用多個內核,並且通常更安全,因為您不必擔心同步訪問共享內存。

有關[GIL] 1的更多信息

暫無
暫無

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

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