Python - блокировка ThreadPoolExecutor.Как разблокировать - PullRequest
0 голосов
/ 03 октября 2018

Следующий код блокирует:

import threading
from concurrent.futures import ThreadPoolExecutor
import os
from pprint import pprint
import time


def sleep(seconds):
    for i in range(seconds):
        try:
            time.sleep(1)
        except KeyboardInterrupt:
            continue


def get_instance():
    return threading.current_thread()


def handle_instance(h):
    pprint("Got instance " + str(h.result()))
    sleep(6)


def task():
    print("Executing our Task on Process: {}".format(os.getpid()))


def main():
    with ThreadPoolExecutor(1) as th_exec:
        th_future = th_exec.submit(get_instance)
        th_future.add_done_callback(handle_instance)


if __name__ == "__main__":
    while True:
        main()
        sleep(1)

Я ожидаю, что через 6 секунд несколько потоков будут выводить сразу.Этого не случилось.Не уверен, как мне это удалось или что я здесь забыл.

1 Ответ

0 голосов
/ 03 октября 2018

Вы не получите ожидаемый результат a handful of threads would have output at once, потому что не запускаете a handful of threads.Вы создаете только один поток за раз для выполнения одной задачи, которая является вызовом функции get_instance().

Вы можете получить что-то близкое к желаемому результату с помощью следующего кода:

import datetime as dt
from concurrent.futures import ThreadPoolExecutor
import os
import threading
import time


def handle_instance(h):
    t = dt.datetime.time(dt.datetime.now())
    print('[{}] Got instance {}'.format(t, h))
    print('[{}] Result is {}'.format(t, h.result()))
    print(id(t))


def task():
    print("Executing our Task on Process: {}".format(os.getpid()))
    time.sleep(3)
    return 1


def main():
    with ThreadPoolExecutor(3) as th_exec:
        for dummy in range(3):
            th_future = th_exec.submit(task)
            th_future.add_done_callback(handle_instance)


if __name__ == "__main__":
    try:
        while True:
            print('A new cycle of execution just started...')
            threading.Thread(target=main, daemon=True).start()
            time.sleep(5)
    except KeyboardInterrupt:
        raise SystemExit('\nexit by user')

Вывод:

A new cycle of execution just started...
Executing our Task on Process: 2528
Executing our Task on Process: 2528
Executing our Task on Process: 2528
[10:40:19.100711] Got instance <Future at 0x262342a9320 state=finished returned int>
[10:40:19.100711] Got instance <Future at 0x2623425e128 state=finished returned int>
[10:40:19.100711] Result is 1
[10:40:19.100711] Result is 1
[10:40:19.100711] Got instance <Future at 0x26233fe3ef0 state=finished returned int>
[10:40:19.100711] Result is 1

exit by user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...