То, как ступить через Python, распараллеливает независимо? (WinPDB)

Я пытаюсь отладить использование Python WinPDB, и у меня есть несколько поточных обработок использования потоков. Поток. Я, никогда может казаться, не управляю потоками индивидуально. Если я повреждаю выполнение, все повреждения сценария. Если я ступаю через исходный код одного потока, все другие продолжают чередоваться и продолжать часть их выполнения. Это верно с включенной или выключенной Синхронностью. Разве там путь не состоит в том, чтобы ступить через поток индивидуально при хранении других в точке останова?

Действительно ли WinPDB является неправильным инструментом для использования для этого? Я просто не знаю, что использовать. Eclipse PyDev едва работает вообще, потому что сам отладчик, кажется, получает ошибки гонки при запуске нескольких потоков.

Что такое инструмент, который на самом деле надежно отладит многопоточную программу Python?

Спасибо.

8
задан MMM 5 August 2010 в 17:04
поделиться

1 ответ

У меня была аналогичная проблема, это не самый лучший ответ, но я опишу ее для вас, и, возможно, вы сможете с ней справиться.

Я более-менее написал мини-отладчик. Udp Client / Server и функция, которая ничего не делала, кроме захвата глобальной блокировки, засыпала 0,1 секунды и затем отпускала ее. Эта функция передается каждому потоку. Затем я вызвал эту функцию между критическими областями, которые я хотел отладить. После запуска программы udp-сервер будет прослушивать клиента, и если я наберу «паузу», он захватит ту же глобальную блокировку, что и разделяемую функцию, и не откажется от нее, пока я не наберу «play» в клиенте. Таким образом, вы можете получить довольно жесткий стоп ... в зависимости от приложения.

Надеюсь, это поможет ... Небольшой фрагмент ниже. Мое приложение предназначалось для тестовой платформы, поэтому я добавил указатель на функцию в конструктор базового класса и использовал его вместо time.sleep () .., что дало мне легкую возможность отладки. Что вы можете сделать, так это передать это каждому потоку и добавить вызовы функции паузы в начале и конце ваших функций, что позволит вам прервать работу и т. Д. Я удалил некоторые команды, но вы можете видеть, что это может быть сделана настолько обширной, насколько вам это нужно.

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()

`

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
ответ дан 6 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: