【问题标题】:Threading in Jupyter notebookJupyter 笔记本中的线程
【发布时间】:2020-01-07 17:38:05
【问题描述】:

我尝试在 Jupyter 笔记本中运行以下代码 sn-p:

    import threading
    import time         
    def worker():
        print(threading.current_thread().getName(), 'Starting')
        time.sleep(0.2)
        print(threading.current_thread().getName(), 'Exiting')


    def my_service():
        print(threading.current_thread().getName(), 'Starting')
        time.sleep(0.3)
        print(threading.current_thread().getName(), 'Exiting')


    t = threading.Thread(name='my_service', target=my_service)
    w = threading.Thread(name='worker', target=worker)
    w2 = threading.Thread(target=worker)  # use default name

    w.start()
    w2.start()
    t.start()

这是输出:

    worker Starting
    Thread-10 Starting
    my_service Starting

我没有看到以下预期输出:

    Thread-10 Exiting
    worker Exiting
    my_service Exiting

(我在使用命令行运行我的 python 文件时确实得到了这些)

这在 Jupyter 笔记本中很常见吗?

【问题讨论】:

    标签: python-3.x jupyter-notebook python-multithreading


    【解决方案1】:

    一旦单元格的主线程中的 Python 语句结束,Jupyter 就会收集输出并将其作为单元格结果呈现。

    在启动工作线程后,尝试在 Jupyter 上的单元格末尾添加 time.sleep(1),它应该可以工作。

    【讨论】:

    • 这是一个 hack,睡眠时间必须根据线程中的任务进行调整,因此如果原始线程的任务持续时间超过一秒,time.sleep(1) 将不再有用。
    【解决方案2】:

    您应该要求线程在单元格的主线程停止之前重新加入单元格的主线程。这可以通过放置来完成

    w.join()
    w2.join()
    t.join()
    

    在单元格的末尾。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2017-05-05
      • 2015-11-11
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多