Извлечение статуса отношений из Facebook в Python, запущенном на Google App Engine - PullRequest
1 голос
/ 12 ноября 2011

Я работаю над приложением Facebook. Он написан на Python и работает на Google App Engine (GAE).

Я знаю, как получить статус взаимоотношений в сети пользователей, но способ, которым я это делаю, работает медленно. GAE имеет ограничение по времени, чтобы уменьшить загрузку ЦП, которая составляет около 60 секунд. Используя следующий код, я могу получить статус отношений около 200 человек за этот промежуток времени до получения «DeadlineExceededError». Конечно, этого недостаточно, поскольку у многих / большинства людей в Facebook больше друзей.

То, что я делаю сейчас, - это получить список друзей пользователя, а затем сделать вызов API для каждого, запрашивающего имя и статус отношения.

Код, который я использую:

for f in friends:
    friends_info[f] = facebook.api('/'+f, {u'fields': 'name,relationship_status', 
    u'access_token': facebook.access_token})

А потом я получаю данные:

rel_status = friends_info[f][u'relationship_status']

Что мне нужно:

Предложения по оптимизации или другие способы извлечения статуса взаимосвязи всей сети.

Заранее спасибо: -)

РЕДАКТИРОВАТЬ:

Ответы, кажется, все хорошие способы решить мою проблему. Хотя я не смог найти хороших учебных пособий для пакетного запроса в Python, поэтому я использовал вызов FQL. При использовании следующего для получения данных требуется 1-2 секунды:

Q = 'select uid, sex, relationship_status from user where uid in (select target_id from connection where source_id = me())'

А фактические данные извлекаются с помощью:

data = fql.query(Q,facebook.access_token)

, которые вызывают эту функцию:

def query(self,Q,access_token):
    ENDPOINT = 'https://api.facebook.com/method/'
    params = dict(query=Q, access_token=access_token, format='json')
    url = ENDPOINT + 'fql.query'
    return self._fetch(url, params=params)

def _fetch(self, url, params=None):
    conn = urllib2.urlopen(url, data=urlencode(params))
    try:
        return json.loads(conn.read())
    finally:
        conn.close()  

Надеюсь, кто-то может использовать это тоже!

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Вы можете использовать график Facebook API пакетных запросов , чтобы запросить до 20 пользователей одновременно

2 голосов
/ 12 ноября 2011

Каждый экземпляр ядра приложения может иметь до 10 параллельных HTTP-запросов, поэтому вы можете сделать это в 10 раз быстрее с помощью create_rpc & make_fetch_call. Есть сценарии, в которых это тоже не работает, поэтому вам нужно разделить задание на несколько задач и позволить им работать параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...