Python: простая асинхронная загрузка содержания URL?

Похоже, что этот ответ может помочь:

SQLAlchemy IN предложение

Подводя итог, вы можете нам _in, например, так: [ 115]

session.query(MyUserClass)
       .filter(MyUserClass.id.in_(SOME_LIST)).all()

9
задан Parand 20 March 2009 в 22:40
поделиться

8 ответов

Используйте асинхронный http-клиент, который использует асинхронный чат и asyncore. http://sourceforge.net/projects/asynchttp/files/asynchttp-production/asynchttp.py-1.0/asynchttp.py/ загрузить

2
ответ дан 4 December 2019 в 11:08
поделиться

Одна опция состояла бы в том, чтобы отправить работу на какую-то очередь (Вы могли использовать что-то Enterprisey как ActiveMQ с pyactivemq или ТОПАТЬ как коннектор, или Вы могли использовать что-то легкое как пустельга, которая записана в Scala и говорит тот же protocl как кэш-память, таким образом, можно просто использовать клиент кэш-памяти Python, чтобы говорить с ним).

После того как Вам настраивали механизм организации очередей, можно создать как многие или как немного задач рабочего, которые подписаны на очередь и делают фактическую работу загрузки, как Вы хотите. Вы можете даже сделать, чтобы они жили на других машинах, таким образом, они не вмешиваются в скорость обслуживания yourwebsite вообще. Когда рабочие сделаны, они отправляют результаты назад на базу данных или другую очередь, где веб-сервер может взять их.

Если Вы не хотите должными быть справляться с внешними рабочими процессами затем, Вы могли бы сделать потоки рабочих в том же процессе Python, который выполняет веб-сервер, но затем очевидно, он будет иметь больший потенциал для влияния на выполнение обслуживания веб-страницы.

4
ответ дан 4 December 2019 в 11:08
поделиться

Я просто создал бы сервис в скрученном, который сделал ту параллельную выборку и анализ и доступ это от web.py как простой запрос HTTP.

2
ответ дан 4 December 2019 в 11:08
поделиться

Я не уверен, что понимаю Ваш вопрос, таким образом, я дам несколько частичных ответов для запуска с.

  • Если Ваше беспокойство - то, что web.py должен загрузить данные из где-нибудь и проанализировать результаты перед ответом, и Вы боитесь, что запрос может испытать таймаут, прежде чем результаты будут готовы, Вы могли использовать ajax для разделения работы. Возвратитесь сразу с контейнерной страницей (для содержания результатов) и немного JavaScript для опроса разъединения относительно результатов, пока у клиента не будет их всех. Таким образом клиент никогда не ожидает сервера, хотя пользователь все еще должен ожидать результатов.
  • Если Ваше беспокойство связывает сервер, ожидающий клиента для получения результатов, я сомневаюсь, будет ли это на самом деле проблемой. Ваши сетевые уровни не должны требовать, чтобы Вы ожидали на записи
  • Если Вы волнуетесь об ожидании сервера, в то время как клиент загружает статическое содержание откуда-либо, или ajax или умное использование перенаправлений должны решить Вашу проблему
0
ответ дан 4 December 2019 в 11:08
поделиться

Вроде ответа MarkusQ MochiKit является хорошей библиотекой JavaScript с устойчивыми асинхронными методами, вдохновленными Скрученным.

0
ответ дан 4 December 2019 в 11:08
поделиться

Я не знаю, будет ли это точно работать, но похоже, что это могло бы: EvServer: Python Асинхронный Сервер WSGI имеет интерфейс web.py и может сделать нажатие стиля кометы клиенту браузера.

Если это не правильно, возможно, можно использовать Согласие клиент HTTP для асинхронной загрузки страниц и выяснить, как служить им браузеру через ajax или комету.

0
ответ дан 4 December 2019 в 11:08
поделиться

На самом деле можно интегрироваться скрученный с web.py. Я не действительно уверен как, поскольку я только сделал это с django (используемый скрученный с ним).

0
ответ дан 4 December 2019 в 11:08
поделиться

Вы можете использовать urllib для загрузки файлов и очереди ] для управления несколькими рабочими потоками. например:

import urllib
from threading import Thread
from Queue import Queue

NUM_WORKERS = 20

class Dnld:
    def __init__(self):
        self.Q = Queue()
        for i in xrange(NUM_WORKERS):
            t = Thread(target=self.worker)
            t.setDaemon(True)
            t.start()

    def worker(self):
        while 1:
            url, Q = self.Q.get()
            try:
                f = urllib.urlopen(url)
                Q.put(('ok', url, f.read()))
                f.close()
            except Exception, e:
                Q.put(('error', url, e))
                try: f.close() # clean up
                except: pass

    def download_urls(self, L):
        Q = Queue() # Create a second queue so the worker 
                    # threads can send the data back again
        for url in L:
            # Add the URLs in `L` to be downloaded asynchronously
            self.Q.put((url, Q))

        rtn = []
        for i in xrange(len(L)):
            # Get the data as it arrives, raising 
            # any exceptions if they occur
            status, url, data = Q.get()
            if status == 'ok':
                rtn.append((url, data))
            else:
                raise data
        return rtn

inst = Dnld()
for url, data in inst.download_urls(['http://www.google.com']*2):
    print url, data
3
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

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