2016-03-25 4 views
3

Python 2.7 içinde requests modülü denenmiş ve çok sevdim ama dizisindeki kullanmaya çalıştığında, işe görünmüyor ettik:Python "istekleri" iş parçasında çalışmıyor/engellemiyor?

def doWork(): 
    try: 
     print "before" 
     requests.get('http://www.google.fr') 
     print "after" 
    except Exception as e: 
     print "Error : "+ str(e) 

# Working : I see "before" & "after" 
doWork() 

# Not working, i see "before" but never "after" 
t = Thread(target=doWork) 
t.start() 

Ben bu yolu denedim ama Aynı şey:

class TestThread(Thread): 
    def run(self): 
     try: 
      print "before" 
      requests.get('http://www.google.fr') 
      print "after" 
     except Exception as e: 
      print "Error : "+ str(e) 

test_thread = TestThread() 
test_thread.start() # I will see "before" but never "after" 
test_thread.join() 

Birkaç dakika (saat) beklemeye çalıştım, ancak hala çalışmıyor; Ne after ne de bir hata hiç yazdırılmamış. Muhtemelen bir şey özledim ama ne olduğunu göremiyorum.

İstekler 2.9.1 kullanıyorum; Python 2.7.11 (Anaconda 2.4.1 32 bit) ve ben Windows 7'deyim.

+0

Lütfen 'request .__ version__',' sys.version' ve hangi işletim sistemini kullandığınızı –

+0

sağladım. –

+0

bunu kabukta veya bir '.py' dosyasından çalıştırıyorsunuz –

cevap

0

Tamam, bunu kazdım ve problemi (görsel stüdyodan değil) buldum. Yeni bir proje denedim ve sorun yaşamadım.

Ben "ana" pitonun dosya derlenmiş olmadığını biliyoruz, bu yüzden yaptığını:

"compiled_main" i Exemple için önce yayınlanmıştır kodudur
if __name__ == '__main__': 
    import compiled_main 

. Bu şekilde, "istekleri" kullanan herhangi bir ileti dizisi engellenecek, istek hiçbir zaman yürütülmeyecek ve hiçbir zaman bir istisna getirmeyecektir. Eğer() katılırsam, kodum asla serbest bırakılmayacak bir iş parçacığı bekler.

".run()" ifadesinin kullanılması işe yaramadı, ancak bir iş parçacığı başlatmıyor, yalnızca yöntemi klasik yöntem olarak adlandıracağım kontrol ettim ve not aldım, bu yüzden bir çözüm değil.

Çözüm: tüm kodu içeren bir init() yöntemini oluşturun ve bu

gibi ana kimseyi arama: Hiçbir zaman

Çözüm 1 olarak alınacak bir dosyada doğrudan iplik başlamak

if __name__ == '__main__': 
    import compiled_main 
    compiled_main.init() 

Çözüm 2: (derlenmiş değil, gerçek bir) ana doğrudan kodunuzu Yürütme Yardımlarınız için

sayesinde herkes, bunu için bana rehberlik lution (özellikle + Antti Haapala)

+0

1- '.run()' ve '.start()' yöntemlerini karıştırmayın. ** Asla '.run()' yi manüel olarak çağırmayın. ** 2- Eğer global düzeyde bir konu başlatamazsanız, eğer '__name__ == '__main __'' guard. İstekler üzerinde bir etkisi yoktur.Ana parçayı iki şekilde engellememeli – jfs