2017-08-04 3 views
-1

Ich lese schon this Thema, aber wenn ich versuche, diesen Code zu laufen, werde ich ein wenig DeltaWie laufen zwei Threads gleichzeitig auf 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() 

wenn wir Verfahren Stellung zu nehmen und den Code ausführen, werden wir das Ergebnis sehen:

1501843580.508508 
1501843580.5089302 

wenn wir Themen und führen Sie den Code kommentieren, werden wir das Ergebnis sehen:

1501843680.4178944 
1501843680.420028 

wir Delta in der gleichen Situation bekam, meine Frage ist, wie threa laufen ds zur gleichen Zeit, weil ich die Generierung des Schlüssels in der Kryptographie-Python-Bibliothek prüfen will. Ich möchte überprüfen, was, wenn ich versuche, zwei Schlüssel zur gleichen Zeit zu generieren, werden sie gleich oder nicht.

+0

Ich bin nicht sicher, was Sie wollen, aber ich werde meine Beste Vermutung geben, was Sie fragen: Sie werden gefragt, ob, wenn zwei Threads laufen, entweder mit den Modulen 'multiprocessing' oder' threading' werden sie genau zur selben Zeit ausgeführt. Sie fragen, ob Sie einen kryptografischen Schlüssel von der aktuellen Zeit ableiten, werden sie das gleiche Ergebnis von beiden Methoden geben.Sind meine Annahmen darüber, was Sie richtig fragen? –

+0

ja, Sie sind richtige Annahmen gemacht – Anton

Antwort

0

Die parallele Verarbeitung zweier Funktionen, wie in Ihrem Code, garantiert nicht, dass die Funktionen exakt zur selben Zeit ausgeführt werden. Wie Sie gesehen haben, gibt es eine geringfügige Diskrepanz in der Zeit, in der die Methoden den Aufruf time.time() erreichen, und dies ist zu erwarten.

Insbesondere aufgrund der Art und Weise, dass das threading Modul entworfen ist, ist es nicht möglich, die Methoden bei genau gleichzeitig laufen. Ähnlich, während das multiprocessing Modul theoretisch zwei Funktionen zur genau gleichen Zeit ausführen könnte, gibt es keine Garantie dafür, und es wird wahrscheinlich ein seltenes Ereignis sein.

Am Ende stößt dies gegen die Low-Level-Constraints eines Betriebssystems, bei dem zwei Codeteile nicht gleichzeitig auf demselben Prozessorkern ausgeführt werden können.

Um Ihre Frage zu beantworten, wie sich dies auf die von Ihrem Code erzeugten Schlüssel auswirkt, hängt es davon ab, wie empfindlich Ihr Algorithmus auf die aktuelle Zeit reagiert. Wenn Ihr Algorithmus einen Schlüssel der aktuellen Zeit auf die nächste Sekunde oder eine Zehntelsekunde basiert, sind die erzeugten Schlüssel wahrscheinlich identisch (aber nicht garantiert). Wenn die erzeugten Schlüssel jedoch auf der genauen Zeit basieren, zu der der Funktionsaufruf erreicht wird, ist es unwahrscheinlich, dass sie jemals übereinstimmen, da es keine Garantie für die Zeit gibt, zu der die Funktionsaufrufe in den zwei Funktionen erreicht werden. Weitere Informationen zu den Unterschieden zwischen den Modulen threading und multiprocessing finden Sie unter this.

0

Die GIL ist eine Sperre auf Interpreter-Ebene. Diese Sperre verhindert die gleichzeitige Ausführung mehrerer Threads im Python-Interpreter. Jeder Thread, der ausgeführt werden soll, muss warten, bis die GIL vom anderen Thread freigegeben wird, was bedeutet, dass Ihre Multithread-Python-Anwendung im Wesentlichen ein Thread ist. Ein anderer Ansatz besteht darin, das Multiprocessing-Modul zu verwenden, in dem jeder Prozess ausgeführt wird eigener Betriebssystemprozess mit eigener Python-Laufzeit. Mit diesem Ansatz können Sie die Vorteile mehrerer Kerne voll ausschöpfen, und das ist in der Regel sicherer, da Sie sich keine Gedanken über die Synchronisierung des Zugriffs auf den gemeinsamen Speicher machen müssen.

für weitere Informationen über [GIL]1

Verwandte Themen