2017-08-04 58 views
-1

我已經讀過this話題,但是當我嘗試運行這段代碼,我會一點點增量如何在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() 

如果我們徵求意見過程和運行代碼,我們將看到的結果是:

1501843580.508508 
1501843580.5089302 

如果我們跟帖評論和運行代碼,我們將看到的結果是:

1501843680.4178944 
1501843680.420028 

我們在相同的情況下得到了增量,我的問題是如何運行threa同時,由於我要檢查密碼學python庫中密鑰的生成。 我想檢查一下,如果我試圖在同一時間生成兩個密鑰,它們會不會相同。

+0

我不能肯定,因爲你想要什麼,但我會給我最好的猜測,你所要求的詳細信息:你問,如果當兩個線程運行,無論是使用'multiprocessing'或'threading'模塊,它們將同時運行。你問的是,如果你從當前時間開始加密密鑰,他們是否會從兩種方法中得到相同的結果。我的假設是關於你問的是正確的嗎? –

+0

是的,你做出了正確的假設 – Anton

回答

0

兩個函數的並行處理(如代碼中)並不保證函數將在同一時間運行。正如您所看到的,在方法到達time.time()呼叫的時間中存在細微的差異,這是可以預料的。

特別是由於threading模塊的設計方式,這些方法不可能同時在正好處運行。同樣,雖然multiprocessing模塊理論上可以在同一時間運行兩個函數,但不能保證這一點,而且這很可能很少發生。

最後,這是針對操作系統的低級別限制,兩個代碼不能同時在同一個處理內核上同時運行。

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

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

0

GIL是解釋器級鎖。該鎖可以防止在Python解釋器中一次執行多個線程。每個想要運行的線程都必須等待其他線程釋放GIL,這意味着您的多線程Python應用程序本質上是單線程的,另一種方法是使用多處理模塊,其中每個進程運行在其中擁有自己的Python運行時自己的OS進程。這種方法可以充分利用多個內核,並且通常更安全,因爲您不必擔心同步對共享內存的訪問。

[GIL]1

相關問題