Python concurrent.futures - 未调用的方法

时间:2016-10-15 06:13:28

标签: python django multithreading

我正在使用以下代码运行本地django服务器:

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 个答案:

答案 0 :(得分:3)

The Executor.map function旨在将参数从迭代传递到映射函数。你没有提供任何迭代,所以它不会运行(你的函数不带参数,所以如果你提供了iterables,它会在传递太多参数时失败)。

如果您只想在没有参数的情况下运行该函数多次,请致电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

答案 1 :(得分:2)

首先,您使用map代替submit。前者是一种类似于内置map函数的方法,用于将参数映射到要在所有这些函数上异步运行的函数。您使用mapi+1而不是可迭代 (例如[i+1]),但不要在你的情况下这样做。您只将一个值传递给地图。

但是,

submit只会在您的池中异步启动一个函数。这正是你想要做的!

我稍微修改了你的例子,以下是代码。还要考虑一下 阅读如果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的答案,它可以确定您的所有任务何时完成。