【问题标题】:Debugging multi-threaded Python with Wing IDE使用 Wing IDE 调试多线程 Python
【发布时间】:2009-08-16 14:06:40
【问题描述】:

我正在使用 Wing IDE 调试一个多线程 Python 程序。

当我按下暂停按钮时,它只暂停一个线程。我已经尝试了十次,它总是暂停同一个线程,在我的例子中称为“ThreadTimer Thread”,而其他线程继续运行。我想暂停这些其他线程,以便我可以与它们一起工作。我该怎么做?

【问题讨论】:

    标签: python multithreading debugging ide


    【解决方案1】:

    我不知道 Wing IDE 是否可以进行多线程调试。

    但是您可能对具有此功能的Winpdb 感兴趣

    【讨论】:

    • 来自 Wing 文档:“Wing 的调试器提供了一个强大的工具集,用于快速定位和修复单线程或多线程 Python 代码中的错误。”不幸的是,我在文档中找不到我的问题的答案。
    • 我检查了Winpdb,很棒!
    【解决方案2】:

    根据the docs,所有运行 Python 代码的线程都将停止(默认情况下,除非您不打算实现不同的效果)。您看到的线程是否没有停止运行非 Python 代码(I/O,比如说:这会产生自己的问题),或者您是否正在做其他事情而不是在原始安装中运行而没有文档描述的仅暂停的调整一些线程...?

    【讨论】:

    • 这是一个原始安装,但我在 wxPython 中工作。这是否意味着我无法停止 wxPython 线程?
    • 如果我正确理解您的意思,我相信您无法停止 GUI 踩踏(这会使整个 GUI 无响应)。
    • 我不是指Wing的GUI线程,我是指我的程序的GUI。让它无响应有什么问题?
    • 哦,我看错了你。只要在您请求线程停止时它正在运行 Python 代码(与构成 wxWidgets/wxPython 主体的大量 C++ 代码相反)它就应该停止,无论是 GUI 还是无 GUI。
    • 你提到 wxPython 让我想起了在wingware.com/doc/howtos/wxpython 找到的文档——我假设你可以调试他们提供的 demo.py 没有问题;如果你调整它以添加一些最小的线程,你能非常简单地重现你的问题吗?
    【解决方案3】:

    我只是在创建线程时为其命名。

    示例线程:

    import threading
    from threading import Thread
    
    #...
    client_address = '192.168.0.2'
    #...
    
    thread1 = Thread(target=thread_for_receiving_data,
                             args=(connection, q, rdots),
                             name='Connection with '+client_address,
                             daemon=True)
    thread1.start()
    

    然后你可以随时从线程内部访问名称

    print(threading.currentThread())
    sys.stdout.flush() #this is essential to print before the thread is completed
    

    您还可以列出具有特定名称的所有线程

    for at in threading.enumerate():
        if at.getName().split(' ')[0] == 'Connection':
            print('\t'+at.getName())
    

    可以对进程做类似的事情。

    示例流程:

    import multiprocessing
    
    
    process1 = multiprocessing.Process(target=function,
                             name='ListenerProcess',
                             args=(queue, connections, known_clients, readouts),
                             daemon=True)
    process1.start()
    

    使用进程会更好,因为您可以从外部通过其名称终止特定进程

    for child in multiprocessing.active_children():
        if child.name == 'ListenerProcess':
            print('Terminating:', child, 'PID:', child.pid)
            child.terminate()
            child.join()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-02
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      相关资源
      最近更新 更多