如何在python上同时运行两个线程?

时间:2017-08-04 10:53:09

标签: python multithreading python-3.x

我已经阅读了this主题,但是当我尝试运行此代码时,我会稍微看一下delta

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

如果我们评论Thread并运行代码,我们将看到结果:

1501843680.4178944
1501843680.420028
我们在相同的情况下得到delta,我的问题是如何同时运行线程,因为我想检查密码学python库中密钥的生成。 我想检查一下如果我尝试同时生成两个密钥,它们是否相同。

2 个答案:

答案 0 :(得分:0)

两个函数的并行处理(如代码中所示)并不能保证函数将在完全相同的时间运行。如您所见,方法达到time.time()调用的时间略有差异,这是可以预期的。

特别是由于threading模块的设计方式,方法无法在完全同时运行。同样,虽然multiprocessing模块理论上可以在同一时间运行两个函数,但不能保证这一点,并且可能很少发生。

最后,这与操作系统的低级约束相抵触,在这种情况下,两个代码在同一个处理核心上无法在物理上同时运行。

要回答有关这将如何影响代码生成的密钥的问题,这取决于算法对当前时间的敏感程度。如果您的算法将当前时间的密钥基于最接近的秒或十分之一秒,则生成的密钥可能相同(但不保证是相同的)。但是,如果生成的密钥基于到达函数调用的确切时间,则它们不可能匹配,因为无法保证在两个函数中将到达函数调用的时间。

有关threadingmultiprocessing模块之间差异的详细信息,请参阅this

答案 1 :(得分:0)

GIL是一个解释器级锁。此锁定可防止在Python解释器中同时执行多个线程。每个想要运行的线程必须等待另一个线程释放GIL,这意味着你的多线程Python应用程序基本上是单线程的,

另一种方法是使用多处理模块,其中每个进程在其自己的OS进程中运行,并具有自己的Python运行时。您可以通过这种方法充分利用多个核心,并且它通常更安全,因为您不必担心同步对共享内存的访问。

了解有关[GIL] 1

的更多信息