2016-10-15 3 views
1

Я бег локального сервера Джанго со следующим кодом:Python concurrent.futures - метод не называется

import concurrent.futures 

media_download_manager = concurrent.futures.ProcessPoolExecutor(max_workers=2) 

def hello(): 
    print "hello" 


for i in range(1, 1000): 
    print "submitting task " 
    media_download_manager.map(hello) 

Я инициализацией исполнителя процесса пула принимать задания с 2 рабочих потоками. Задачами являются отправитель, но рабочие потоки, обрабатывающие представленные задачи, похоже, не срабатывали.

После его консольный вывод:

submitting task 1 
submitting task 2 
submitting task 3 
submitting task 4 
submitting task 5 
submitting task 6 
submitting task 7 
submitting task 8 
submitting task 9 
Performing system checks... 

System check identified no issues (0 silenced). 
October 15, 2016 - 06:09:31 
Django version 1.8.4, using settings 'Learn.settings' 
Starting development server at http://192.168.1.3:8000/ 
Quit the server with CONTROL-C. 

Что я здесь отсутствует?

ответ

2

Во-первых, вы используете map вместо submit. Первый способ аналогичен встроенной функции map для сопоставления аргументов функции, которую вы хотите запустить асинхронно для всех из них. Вы использовали map с i+1 вместо итерабельного (например, [i+1]), но не делайте этого в своем случае. Вы передаете на карту только одно значение.

submit однако, пожар только одна функция asynchorincally в вашем бассейне. Это именно то, что вы хотите сделать!

Я немного изменил ваш пример, следуя этому коде. Также подумайте о , если ThreadPoolManager может быть выгодным в вашем случае вместо ProcessPoolManager, поскольку он, как представляется, связан с I/O (сетевой материал). Но не поймайте на этом .

import concurrent.futures 
from time import sleep 
from random import random 

media_download_manager = concurrent.futures.ProcessPoolExecutor(max_workers=4) 

def hello(i): 
    be_sleepy = random() * 2 
    sleep(be_sleepy) 
    print("hello", i) 


if __name__ == '__main__': # protecting funny multiprocessing error on Windows 
    for i in range(10): 
     print("submitting task", i) 
     media_download_manager.submit(hello, i+1) 
     # media_download_manager.map(hello, [i+1]) # <--awkward ;), notice additional [] 

Пример вывода:

submitting task 0 
submitting task 1 
submitting task 2 
submitting task 3 
submitting task 4 
submitting task 5 
submitting task 6 
submitting task 7 
submitting task 8 
submitting task 9 
hello 1 
hello 3 
hello 6 
hello 2 
hello 7 
hello 9 
hello 5 
hello 4 
hello 8 
hello 10 

Также обратите внимание @ ответ ShadowRanger, который имеет возможность определить, когда все ваши задачи завершено.

2

The Executor.map function предназначен для передачи аргументов из итерации (-ов) в функцию сопоставления. Вы не предоставили никаких итераций, чтобы он не запускался (и ваша функция не принимает никаких аргументов, поэтому, если бы вы предоставили итерации, это не сработало бы, когда оно передало слишком много аргументов).

Если вы просто хотите запустить эту функцию без аргументов несколько раз, вызовите submit; map предназначен для передачи аргументов и накопления результатов от того, что он возвращает, а не просто для чего-то запускать побочные эффекты (это функциональный программный инструмент, а функциональный код вообще является побочным эффектом).

Фиксированный код будет:

futures = [] 
for i in range(1, 1000): 
    print "submitting task " 
    futures.append(media_download_manager.submit(hello)) 
concurrent.futures.wait(futures) # Wait for all tasks to finish 
Смежные вопросы