2010-08-05 13 views
8

WinPDB kullanarak Python'da hata ayıklamaya çalışıyorum ve iş parçacığı kullanarak birden fazla iş parçacığım var.Thread. Konuları ayrı ayrı kontrol edemiyorum. Yürütmeyi kesersem, komut dosyasının tümü bozulur. Bir iş parçacığının kaynak kodunu adım adım atarsam, diğerlerinin tümü ara verilmeye devam eder ve yürütme işlemlerinin bir kısmını devam ettirir. Bu, Eşzamanlılık açık veya kapalı olduğunda geçerlidir. Diğerlerini bir kırılma noktasında tutarken bir iş parçacığını tek tek atmanın bir yolu yok mu?Python iş parçacıklarını bağımsız olarak nasıl geçiririm? (WinPDB)

WinPDB bunun için yanlış bir araç mıdır? Sadece ne kullanacağımı bilmiyorum. Eclipse PyDev neredeyse hiç işe yaramıyor çünkü hata ayıklayıcının kendisi birden çok iş parçacığı başlatırken yarış hataları alıyor gibi görünüyor.

aslında sağlam bir çok parçalı Python programında hata ayıklama yapacak bir araç nedir?

Teşekkür ederiz.

+0

pdb parçacıklı programları ayıklama desteklemez. Bu olsa PyDev ile çalışmalıdır. Ne tür bir problemi deneyimliyorsunuz? –

cevap

1

Benzer bir sorunla karşılaştım, en ideal cevap değil, ama sizin için bunu açıklayacağım ve belki de bunun üzerinde çalışabilirsiniz.

Mini hata ayıklayıcım daha çok veya daha az yazdım. Udp İstemcisi/Sunucusu ve bir şey yapmayan ancak global bir kilit yakalayan bir işlev, uyku .1 saniye ve sonra serbest bırakın. Bu işlev her iş parçacığına geçti. Ardından, hata ayıklamak istediğim kritik alanlar arasında bu işleve bir çağrı koydum. Programı başlattıktan sonra, udp sunucusu istemciyi dinlerdi ve "duraklat" yazmış olsaydım, paylaşılan işlev tarafından kullanılanla aynı genel kilidi alır ve istemciye "oynat" yazana kadar pes etmem. Bu yüzden, uygulamaya bağlı olarak, oldukça sıkı bir duruş sağlayabilirsiniz.

Yardımcı olur umarım ... Aşağıdaki küçük parçacık. Uygulamam bir test platformuydu, bu yüzden yaptığım şey temel sınıf yapıcısına işlev göstericisini ekliyordu ve bunu time.sleep() yerine kullanmakta kullanıyorum. Yapabildiğiniz şey, her iş parçacığına iletmek ve işlevlerinizin başında ve sonunda duraklatma işlevine çağrılar eklemek, ve kırmanıza izin verir vb. Bazı komutları kaldırdım ancak bunun olabileceğini görebilirsiniz. İhtiyacınız kadar kapsamlı yapılmış.

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

Bu UDP istemcisi/sunucusuyla ilk cevaplayıcının ne yaptığını tam olarak anlamadım. PyDev çalışmıyor çünkü hata ayıklayıcının durum bilgisiyle yazmayı denediği bazı XML dosyaları ile bu garip hataları alıyor. Belki de, çok iş parçacıklı bir program çalıştırırken aynı anda dosyaya yazmaya çalışan birden çok iş parçacığı vardır ve bunu işlemek için ayarlanmamıştır. – MMM

+0

üzgünüm, hiç kullanmadım – pyInTheSky

İlgili konular