首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何独立地通过Python线程?(WinPDB)

如何独立地通过Python线程?(WinPDB)
EN

Stack Overflow用户
提问于 2010-08-05 17:04:02
回答 1查看 1.2K关注 0票数 8

我正在尝试使用WinPDB调试Python,并且我有多个线程使用threading.Thread。我似乎永远无法单独控制这些线程。如果我破坏了执行,整个脚本就会中断。如果我逐步遍历一个线程的源代码,所有其他线程都将继续交织,并继续执行它们的某些操作。这是对同步性打开或关闭。难道没有办法在将其他线程保持在断点的同时单独通过线程吗?

WinPDB是用于此的错误工具吗?我只是不知道该用什么。Eclipse PyDev根本无法工作,因为调试器本身在启动多个线程时似乎会出现争用错误。

什么是真正有效地调试多线程Python程序的工具?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2010-08-09 04:20:27

我有一个类似的问题,这不是最理想的答案,但我会为你描述,也许你可以解决它。

我或多或少写了一个迷你调试器。Udp客户机/服务器和一个只会获取全局锁的函数,睡眠.1秒,然后释放它。这个函数被传递给每个线程。然后,在我想调试的关键区域之间调用这个函数。启动程序后,udp服务器将侦听客户端,如果我输入“暂停”,它将获取共享函数使用的相同的全局锁,直到我在客户机中输入"play“时才放弃它。所以这样做,你可以得到一个相当紧的停车..。取决于应用程序。

希望能帮上忙..。下面的小片段。我的应用程序是用于测试平台的,所以我所做的是将函数指针添加到基类构造函数,并使用它而不是time.sleep()。给了我温和的调校能力。您可以做的是将这个传递给每个线程,并在函数的开始和结束时添加对暂停函数的调用,它将允许您中断,等等。我删除了一些命令,但您可以看到这可以根据您的需要进行广泛的操作。

代码语言:javascript
复制
PAUSE_NOW     = thread.allocate_lock()
def pause(s):
'''
    FUNCTION: testStatus

    DESCRIPTION: function passed to all test objects

    INPUTS: none

    RETURNS: none
'''
    global Pause_NOW
    PAUSE_NOW.acquire()
    time.sleep(s)
    PAUSE_NOW.release()

`

代码语言:javascript
复制
def server():
    '''
        \r\n
        FUNCTION: server

        DESCRIPTION: UDP server that launches a UDP client. The client it
                     starts can issue commands defined in cmdlineop. Most
                     functions return a status, but some are meant to block
                     the main thread as a means of pausing a test, in which case
                     a default response is returned.

        INPUTS: none

        RETURNS: none
    '''
    global EXIT
    global Pause_NOW

    host = "localhost"
    port = 21567
    buf  = 1024
    addr = (host,port)

    UDPSock = socket(AF_INET,SOCK_DGRAM)
    UDPSock.bind(addr)
    sleep(1)
    os.startfile('client.py')
    #os.system('start python client.py')
    cmdlineop   =   {
                    'pausenow' : "PAUSE_NOW.acquire()",
                    'playnow'  : "PAUSE_NOW.release()",
                }
    while 1:
        output = 'RECEIVED CMD'
        # if EXIT: break
        data,addr = UDPSock.recvfrom(buf)
        if not data:
            break
        else:
            if cmdlineop.has_key(data.split()[0]):
                exec(cmdlineop[(data.split()[0])])
                UDPSock.sendto(('\n'+output+'\n'),addr)
                data = ''
            else:
                UDPSock.sendto('INVALID CMD',addr)
    UDPSock.close()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3417212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档