def main():
    #  print(sys.version)
    #  スレッドベースの非同期実行
    future = ThreadPoolExecutor().submit(f, 'wef')
    is_feature = isinstance(future, Future)
    print(is_feature)

    result = future.result()
    print(result)

    is_running = future.running()
    print(is_running)

    is_done = future.done()
    print(is_done)

    is_cancelled = future.cancelled()
    print(is_cancelled)

    #  print(download(urls[0]))
    get_sequentials()
    get_multi_thread()

    counter = Counter()
    threads = 2
    with ThreadPoolExecutor() as e:
        #  2つのスレッドを用意し、それぞれcount_upを呼び出す
        futures = [e.submit(count_up, counter) for _ in range(threads)]
        done, not_done = wait(futures)
        #  print(done, not_done)

    print(f'{counter.count} != 2000000')


    counter2 = ThreadSafeCounter()
    threads = 2
    with ThreadPoolExecutor() as e:
        #  2つのスレッドを用意し、それぞれcount_upを呼び出す
        futures = [e.submit(count_up, counter2) for _ in range(threads)]
        done, not_done = wait(futures)
        print(done, not_done)

    print(f'{counter2.count} == 2000000')


    with ThreadPoolExecutor(max_workers=3) as e:
        d = Downloader()
        futures = [e.submit(d.get(url)) for url in urls]
        for future in as_completed(futures):
            #  r = future.result()
            print(future)




    c = MyClass()
    c.execute()
from concurrent.futures import (ThreadPoolExecutor, Future)


def func():
    return 1


if __name__ == '__main__':
    # 非同期に行いたい処理をsubmitに渡すと、
    # その処理の実行がスケジューリングされて
    # Futureクラスのインスタンスが返される。
    # ThreadPoolExecutorはスレッドベースの非同期実行
    future = ThreadPoolExecutor().submit(func)
    print(isinstance(future, Future))

    # futureはスケジューリングされた呼び出し可能オブジェクトを
    # カプセル化したもので、実行が先送りされている事を表現している。
    # スケジューリングはconcurrent.futuresモジュールが行う。

    # 非同期で実行した処理の戻り値を取得
    print(future.result())

    # 現在の状態を確認する
    print(future.done())
    print(future.running())
    print(future.cancelled())