有没有办法在单个函数下为多个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()
但有没有办法在单一功能下实现这一目标?
答案 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(全局解释锁定)。