核心和线程的多处理功能

时间:2018-12-04 17:24:37

标签: python multithreading multiprocessing

我编写了一个程序,该程序根据Lucas-Lehmer序列确定梅森素数是素数还是素数。我想使用多处理和/或多线程来减少检查素数所需的时间,因此我在此处和在Youtube上研究了其他帖子和教程,但是这些示例通常使用截然不同的实现;无论他们使用的是“线程”模块还是“线程”模块,并且通常仅具有一个功能。我该如何并行执行我的2个功能;这需要花费不同的时间来计算,并且需要将计算返回到第三函数以得到最终结果。(请注意,我最近才开始编程)。我知道我可以对算法本身进行优化。如果Mersenne素数的最后一位是偶数或5,那么它应该只打印素数,但我要特别关注并行化。谢谢。代码:

def Checker(pm_n=(2, 4)):
pm, n = pm_n
lls = (n ** 2 - 2)
lls = n
lls = (n ** 2 - 2)
mp  = (2 ** pm - 1)
pm = pm + 1
mp  = (2 ** pm - 1)
if (lls % mp == 0):
    return True
else:
    return False

使用并行代码,我将3个功能简化为一个:

{{1}}

如果名称 =='主要”:     从多处理导入池     将Pool(4)作为池:         pm1 = 2         n1 = 4         pm2 = 3         n2 =(n1 ** 2-2)         pm3 = 4         n3 =(n2 ** 2-2)         pm4 = 5         n4 =(n3 ** 2-2)         结果= pool.map(检查器,[[pm1,n1),(pm2,n2),(pm3,n3),(pm4,n4)])         打印(结果)         而True:             pm1 = pm4 + 1             n1 =(n4 ** 2-2)             pm2 = pm1 + 1             n2 =(n1 ** 2-2)             pm3 = pm2 + 1             n3 =(n2 ** 2-2)             pm4 = pm3 + 1             n4 =(n3 ** 2-2)             结果= pool.map(检查器,[[pm1,n1),(pm2,n2),(pm3,n3),(pm4,n4)])             打印(结果)

在4个数组长的数组中,素数的输出为True,非素数的输出为False。然后,接下来的4个数字是否为素数将在数组中输出。

1 个答案:

答案 0 :(得分:0)

不要使用线程。 Python具有全局解释器锁,因此多线程将比单线程慢。尽管您最好的选择是并行运行多个Checker,但多处理可能会有所帮助。您发现的大多数示例都将使用多处理池。看起来像这样:

if __name__ == "__main__":
    from multiprocessing import Pool
    with Pool(4) as pool:
        result = pool.map(Checker, [(pm1, n1), (pm2, n2), (pm3, n3), (pm4, n4)])
        print(result)

这将并行运行检查程序四次。

编辑:但是,这可能仍然比串行执行慢,除非您要求在每次检查中进行大量计算。

编辑:显示如何保护多处理程序的执行。