2017-01-24 7 views
1

Я использую библиотеку многопроцессорности python для выполнения сценария selenium. Мой код ниже:Как использовать пул многопроцессорности python в непрерывном цикле

#-- start and join multiple threads --- 
thread_list = [] 
total_threads=10 #-- no of parallel threads 
for i in range(total_threads): 
    t = Process(target=get_browser_and_start, args=[url,nlp,pixel]) 
    thread_list.append(t) 
    print "starting thread..." 
    t.start() 

for t in thread_list: 
    print "joining existing thread..." 
    t.join() 

Как я понял функцию join(), он будет ждать каждого завершения процесса. Но я хочу, чтобы как только процесс был выпущен, ему будет назначена другая задача для выполнения новой функции.

Это может быть понято как это:

Say 8 процессы начались в первую очередь.

no_of_tasks_to_perform = 100 

for i in range(no_of_tasks_to_perform): 
    processes start(8) 
    if process no 2 finished executing, start new process 
    maintain 8 process at any point of time till 
    "i" is <= no_of_tasks_to_perform 

ответ

1

Вместо того, чтобы начинать новые процессы каждый сейчас и потом, попробуй поставить все свои задачи в multiprocessing.Queue() и начать 8 давно запущенные процессы, в каждом процессе держать доступ к очереди задач, чтобы получить новые задачи и затем выполняйте эту работу, пока не будет никакой задачи.

В вашем случае, это больше похоже на это:

from multiprocessing import Queue, Process 

def worker(queue): 
    while not queue.empty(): 
     task = queue.get() 

     # now start to work on your task 
     get_browser_and_start(url,nlp,pixel) # url, nlp, pixel can be unpacked from task 

def main(): 
    queue = Queue() 

    # Now put tasks into queue 
    no_of_tasks_to_perform = 100 

    for i in range(no_of_tasks_to_perform): 
     queue.put([url, nlp, pixel, ...]) 

    # Now start all processes 
    process = Process(target=worker, args=(queue,)) 
    process.start() 
    ... 
    process.join() 
+0

он работал хорошо для меня ... спасибо @Shane –

+0

@shane, Где 8 процессоров в этой установке? Если бы это было просто: 'process.start (8)'. У меня есть собственный исходный код модуля python, который я могу инициализировать классом, чтобы установить экземпляр webDriver, а затем вызвать функцию очистки с параметрами в очереди. Но не нужно ли создавать экземпляры 8 разных веб-дисков в пул, потому что мне интересно, как один буфер буфера X-window (Xvfb) и безголовый хронограв может действовать как 8 различных процессов для выполнения очереди задач (в тысячах) ? – Ricalsin

+0

В этой настройке вы фактически вручную запускаете 8 процессов (или все, что хотите), и делаете каждый из них длительным процессом для непрерывной выборки новой задачи (создайте экземпляр браузера и делайте что-нибудь в своем случае), например. 'process1 = Process (target = worker, args = (queue,))' ... 'process8 ...'. Это другая настройка, если вы хотите использовать 'multiprocessing.Pool', вам нужно передать свою функцию с помощью' map', но на самом деле это не так удобно в вашем случае, особенно когда дело касается нескольких параметров, проверьте это: http: //stackoverflow.com/a/5442981/7405394 – Shane