ThreadPoolExecutor - wypisywanie w odpowiedniej kolejności

Odpowiedz Nowy wątek
2019-08-08 14:24
0

Cześć, jest oto taki prosty przykład

import time
import random
from concurrent.futures import ThreadPoolExecutor

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

def print_letters(index, letter):
    time.sleep(random.randint(1, 3))
    print(index, letter)

with ThreadPoolExecutor(max_workers=10) as executor:
    for index, letter in enumerate(letters, start=1):
        executor.submit(print_letters, index, letter)

po uruchomieniu programu mamy np. takie coś

1 a
8 h
10 j
2 b
4 d
6 f
5 e
3 c
9 i
7 g

czy jest jakiś sposób, aby program wypisywał to w odpowiedniej kolejności jak poniżej?

1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j 

czyli albo program sobie działa i wypisuje "1", kiedy będzie ona gotowa, później czeka na "2" i wypisuje, kiedy będzie gotowa itd. albo działa sobie i czeka aż wszystkie wątki się zakończą i wtedy wypisuje wszystkie w odpowiedniej kolejności.

Jeżeli ktoś może mnie nakierować lub poprawić kod tak, aby działało, będę wdzięczny. (jeżeli można, to najlepiej obie wersje w celach treningowych)

Pozostało 580 znaków

2019-08-08 15:04

Wersja "działa sobie i czeka aż wszystkie wątki się zakończą i wtedy wypisuje wszystkie w odpowiedniej kolejności"

import time
import random
from concurrent.futures import ThreadPoolExecutor

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

def print_letters(letter):
    time.sleep(random.randint(1, 3))
    return letter

with ThreadPoolExecutor(max_workers=10) as executor:
    res = executor.map(print_letters, letters)

for i, ret in enumerate(res, start=1):
    print(i, ret)
edytowany 2x, ostatnio: Spearhead, 2019-08-08 15:05
dzięki! działa jak trzeba :) - draabuu 2019-08-08 15:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0