2017-02-11 22 views
3

делает функцию, чтобы скопировать файл с локального компьютера на удаленный создающий поток делать 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() 

это создает поток и не начать копирование параллельно, но я хочу, чтобы ограничить он обрабатывается как 50 потоков за раз, так как общее количество серверов может быть слишком большим.

ответ

4

Вам необходимо настроить код для совместного использования и отслеживания общего значения.

Это можно сделать с помощью Semaphore Object. Объект содержит внутренний счетчик, и каждый поток пытается его получить. Если счетчик больше вашего определенного максимума, нить не может его приобрести и будет заблокирована до тех пор, пока не станет свободным.

Короткий пример показывает максимум 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() 

Выход

start 0 
start 1 
start 2 
start 3 
start 4 

и через несколько секунд завершаются первые потоки, выполняются следующие потоки

start 5 
start 6 
start 7 
start 8 
start 9 
+0

Это должно быть b e принятый ответ. Прекрасно работает. Кстати, есть ли у вас какой-либо способ повысить приоритет каждой задачи с помощью этого решения? Как и у меня есть некоторые задачи, которые должны иметь возможность приобретать с приоритетом, чем другие. –