限制并行工作的线程数

Nia*_*ora 3 python multithreading paramiko python-multithreading

我正在创建一个函数将文件从本地机器复制到远程创建线程并行执行sftp

def copyToServer():
    //does  copy file given host name and credentials

for i in hostsList:
    hostname = i
    username = defaultLogin
    password = defaultPassword
    thread = threading.Thread(target=copyToServer, args=(hostname, username, password, destPath, localPath))
    threadsArray.append(thread)
    thread.start()
Run Code Online (Sandbox Code Playgroud)

这会创建线程并开始并行复制但我想限制它一次处理50个线程,因为服务器总数可能太多

and*_*pei 6

您需要调整代码以共享并跟踪共同的值.

这可以使用信号量对象完成.该对象拥有一个内部计数器,每个线程都试图获取它.如果计数器大于您定义的最大值,则线程无法获取一个,并且在被释放之前将被阻塞.

一个简短的示例显示并行最多5个线程,一半线程立即执行,其他线程被阻塞并等待:

import threading
import time

maxthreads = 5
sema = threading.Semaphore(value=maxthreads)
threads = list()

def task(i):
    sema.acquire()
    print "start %s" % (i,)
    time.sleep(2)
    sema.release()

for i in range(10):
    thread = threading.Thread(target=task,args=(str(i)))
    threads.append(thread)
    thread.start()
Run Code Online (Sandbox Code Playgroud)

输出

start 0
start 1
start 2
start 3
start 4
Run Code Online (Sandbox Code Playgroud)

几秒钟后,第一个线程完成后,执行下一个线程

start 5
start 6
start 7
start 8
start 9
Run Code Online (Sandbox Code Playgroud)