代码之家  ›  专栏  ›  技术社区  ›  xendi

python-threadpoolexecutor阻塞。如何解除阻塞

  •  0
  • xendi  · 技术社区  · 7 年前

    以下代码正在阻塞:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Poolka    7 年前

    你得不到预期的输出 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