如何在python中的单个函数下并行运行多个for循环

时间:2017-05-17 07:06:41

标签: python multithreading python-2.7 python-3.x

有没有办法在单个函数下为多个for循环实现多线程。我知道如果我们有单独的功能可以实现,但是可以在相同的功能下实现它。 例如:

def sqImport():
    for i in (0,50):
        do something specific to 0-49
    for i in (50,100):
        do something specific to 50-99
    for i in (100,150):
        do something specific to 100-149

如果3个不同的for循环有3个独立的函数,那么我们可以这样做:

threadA = Thread(target = loopA)
threadB = Thread(target = loopB)
threadC = Thread(target = loopC)
threadA.run()
threadB.run()
threadC.run()
# Do work indepedent of loopA and loopB 
threadA.join()
threadB.join()
threadC.join()

但有没有办法在单一功能下实现这一目标?

2 个答案:

答案 0 :(得分:1)

首先:如果您打算在高效系统中使用它,我认为您真的应该看一下multiprocessing.ThreadPool。我在下面描述的只是一种可能的解决方法(可能更简单,因此可用于测试目的)。

您可以将id传递给函数并使用它来决定您采用的循环:

from threading import Thread

def sqImport(tId):
    if tId == 0:
        for i in range(0,50):
            print i
    elif tId == 1:
        for i in range(50,100):
            print i
    elif tId == 2:
        for i in range(100,150):
            print i

threadA = Thread(target = sqImport, args=[0])
threadB = Thread(target = sqImport, args=[1])
threadC = Thread(target = sqImport, args=[2])
threadA.start()
threadB.start()
threadC.start()
# Do work indepedent of loopA and loopB 
threadA.join()
threadB.join()
threadC.join()

请注意,我使用start()而不是run(),因为run()不会启动不同的线程,而是在当前线程上下文中执行。此外,我在for i in (x, y)循环中更改了for i in range(x,y)循环,因为我认为,您希望迭代范围而不是元组(仅迭代x和y)。

使用multiprocessing的替代解决方案可能如下所示:

from multiprocessing.dummy import Pool as ThreadPool

# The worker function
def sqImport(data):
    for i in data:
        print i


# The three ranges for the three different threads
ranges = [
    range(0, 50),
    range(50, 100),
    range(100, 150)
    ]

# Create a threadpool with 3 threads
pool = ThreadPool(3)
# Run sqImport() on all ranges
pool.map(sqImport, ranges)

pool.close()
pool.join()

答案 1 :(得分:0)

您可以使用multiprocessing.ThreadPool在运行的线程之间平均分配任务。 请点击Threading pool similar to the multiprocessing Pool?了解详情。

如果您真的在寻找并行执行,那么请选择进程,因为线程将面向python GIL(全局解释锁定)。