How does ThreadPoolExecutor().map differ from ThreadPoolExecutor().submit?

后端 未结 4 1238
耶瑟儿~
耶瑟儿~ 2021-01-30 06:45

I was just very confused by some code that I wrote. I was surprised to discover that:

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
             


        
4条回答
  •  醉酒成梦
    2021-01-30 07:00

    Below is an example of submit vs. map. They both accept the jobs immediately (submitted|mapped - start). They take the same time to complete, 11 seconds (last result time - start). However, submit gives results as soon as any thread in the ThreadPoolExecutor maxThreads=2 completes. map gives results in the order they are submitted.

    import time
    import concurrent.futures
    
    def worker(i):
        time.sleep(i)
        return i,time.time()
    
    e = concurrent.futures.ThreadPoolExecutor(2)
    arrIn = range(1,7)[::-1]
    print arrIn
    
    f = []
    print 'start submit',time.time()
    for i in arrIn:
        f.append(e.submit(worker,i))
    print 'submitted',time.time()
    for r in concurrent.futures.as_completed(f):
        print r.result(),time.time()
    print
    
    f = []
    print 'start map',time.time()
    f = e.map(worker,arrIn)
    print 'mapped',time.time()
    for r in f:
        print r,time.time()    
    

    Output:

    [6, 5, 4, 3, 2, 1]
    start submit 1543473934.47
    submitted 1543473934.47
    (5, 1543473939.473743) 1543473939.47
    (6, 1543473940.471591) 1543473940.47
    (3, 1543473943.473639) 1543473943.47
    (4, 1543473943.474192) 1543473943.47
    (1, 1543473944.474617) 1543473944.47
    (2, 1543473945.477609) 1543473945.48
    
    start map 1543473945.48
    mapped 1543473945.48
    (6, 1543473951.483908) 1543473951.48
    (5, 1543473950.484109) 1543473951.48
    (4, 1543473954.48858) 1543473954.49
    (3, 1543473954.488384) 1543473954.49
    (2, 1543473956.493789) 1543473956.49
    (1, 1543473955.493888) 1543473956.49
    

提交回复
热议问题