2009-09-02 20 views
7

Bildiğim kadarıyla bir web sitesini asenkronize olarak okumak istiyorum. Şimdi düz soketlerle okumaya çalıştım ama HTTP bana cehennem veriyor. Her türlü funky kodlamaya rastlıyorum, örneğin aktarım kodlaması: yığınlanmış, tüm bu öğeleri manuel olarak ayrıştırmak zorundayım ve şu anda C python'u değil, kodlamayı düşünüyorum.Asyncore ile bir web sitesini okumak

URLLib gibi eşzamansız bir şekilde daha iyi bir yolu yok mu? Önceden tamamlandığında, tüm HTTP spesifikasyonunu yeniden uygulamak gibi hissetmiyorum.

Twisted şu anda bir seçenek değil.

Selamlar,

Tom

cevap

5

Eğer http://asynchttp.sourceforge.net/ baktınız mı? Python

'asynchttp'' modülü 'asyncore' ve modüller 'seçeneğini' üzerine inşa edilmiştir modül 'asynchat' Python kütüphanesi mantıksal uzantısıdır. Amacımız etmektir için

"Asenkron HTTP İstemcisi Mükemmel 'httplib' modülünün işlevselliğini engelleme soketlerini kullanmadan sağlayın.

Projenin son taahhüdü 2001-05-29 idi, bu yüzden ölü görünüyor. Ama yine de ilgi çekici olabilir.

Yasal Uyarı: Kendim kullanmadım.

Ayrıca, this blog post, async HTTP hakkında bazı bilgilere sahiptir.

7

Bir asenkron kendine çağırır uygulayabilir. Her arama için yeni bir iş parçacığı başlatın (ya da bir havuzdan almayı deneyin) ve işlemek için bir geri arama kullanın.

Bir dekoratör ile çok güzel yapabilirsiniz

:

def threaded(callback=lambda *args, **kwargs: None, daemonic=False): 
    """Decorate a function to run in its own thread and report the result 
    by calling callback with it.""" 
    def innerDecorator(func): 
     def inner(*args, **kwargs): 
      target = lambda: callback(func(*args, **kwargs)) 
      t = threading.Thread(target=target) 
      t.setDaemon(daemonic) 
      t.start() 
     return inner 
    return innerDecorator 

@threaded() 
def get_webpage(url): 
    data = urllib.urlopen(url).read() 
    print data 
+2

Maalesef dediğim gibi ben asenkron soket dizileri değil istiyorum. – Tom

+1

Bu çözümün parlak olduğunu düşünen tek kişi ben miyim *?* Diğer tüm * async HTTP yöntemlerinden daha iyi olan şey, aslında bir şey * için tamamen genel bir asenkron çözüm olmasıdır. İstediğiniz herhangi bir kodla 'get_webpage' değiştirebilir ve zaman uyumsuz olarak gerçekleşebilir. – robru

1

En çok geldiğim, codeape'in önerdiği modifiye asynchttp kullanıyordu. Asyncore/asynchat ve asynchttp'i çok fazla acıyla kullanmaya çalıştım. Bu benim içinde tüm hataları düzeltmek için çok uzun sürdü (bir yöntem handle_read, neredeyse asyncore kopyalanan, sadece kötü girintili ve chunked kodlama ile bana baş ağrısı veriyordu). Ayrıca, asyncore ve asynchat en iyisi google'da aldığım bazı ipuçlarına göre kullanılmıyor.

Kıvrılmış bir şekilde yerleştim, ama açıkçası bu sizin için sorun değil.

Ayrıca, uygulamanızla ne yapmaya çalıştığınıza ve nedenler bir seçenek olup olmadığına ilişkin bir uyumsuzluk isteme isteğine bağlı olabilir, GUI programlama veya başka bir şey yapıyorsanız, biraz daha bilgi verebilirdiniz. Bu her zaman iyidir. Değilse, yukarıda önerilen dişli sürüm için oy kullanırdım, çok daha fazla okunabilirlik ve süreklilik sunar.

1

Asyncore basit bir HTTP istemci örneği oldukça basittir :)

http://docs.python.org/library/asyncore.html

import asyncore, socket 

class HTTPClient(asyncore.dispatcher): 

    def __init__(self, host, path): 
     asyncore.dispatcher.__init__(self) 
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.connect((host, 80)) 
     self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path 

    def handle_connect(self): 
     pass 

    def handle_close(self): 
     self.close() 

    def handle_read(self): 
     print self.recv(8192) 

    def writable(self): 
     return (len(self.buffer) > 0) 

    def handle_write(self): 
     sent = self.send(self.buffer) 
     self.buffer = self.buffer[sent:] 


client = HTTPClient('www.python.org', '/') 
asyncore.loop() 
İlgili konular