2017-08-04 59 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

相关问题