繁体   English   中英

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

[英]How to run multiple for loops in parallel under a single function in python

有没有一种方法可以在单个函数下为多个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()

但是,有一种方法可以在单个功能下实现这一目标吗?

首先:我想您真的应该看一下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)更改for i in (x, y) for i in range(x,y) 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()

您可以使用multiprocessing.ThreadPool ,它将在运行线程之间平均分配任务。 遵循类似于多处理池的线程池? 有关此的更多信息。

如果您真的在寻找并行执行,那就去找进程,因为线程将面对python GIL(全局解释锁)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM