在Dask中更新全局列表

时间:2017-10-20 18:59:30

标签: python dask

我想读取一个浮点数流,做一些简单的计算并将值附加到全局列表中。你能说出我弄错了吗?该列表没有附加。

from random import random
from time import sleep

def process(x):
    from random import random
    sleep(random()*2)
    t = x * 2
    processed_queue.append(t)
    print(processed_queue)
    return t

if __name__ == "__main__":

    from distributed import Client
    from queue import Queue

    client = Client()

    processed_queue = []
    input_q = Queue()

    remote_q = client.scatter(input_q)
    processed_q = client.map(process, remote_q)
    result_q = client.gather(processed_q)

    for i in [random() for x in range(100)]:
        sleep(random())
        input_q.put(i)
        print(i)
        print(processed_queue)
        print(result_q.qsize())

1 个答案:

答案 0 :(得分:0)

虽然queue.Queuemultiprocessing.Queue可用于在线程和进程之间发送数据,但通常这种编程旁边的效果不是dask鼓励的模型。

您可以将数据传递给群集执行的功能,并使用client.submit实时获取其返回值,除此之外您不能做什么队列?另外,有一些dask结构,比如共享变量可能会这样做,但是(再次)很少使用,我认为不太适合你的范例。

由于代码不适合您的特定原因:Client()为调度程序创建至少一个单独的进程,为具有一个或多个线程的worker创建一个(请参阅任务管理器,顶部或其他系统观看工具)。 queue.Queue是进程本地的,因此每个进程都会看到空队列并添加到其中,但是在主进程中看不到该信息,并且在工作程序中看不到输入队列上的操作。