API контактов Google: временная внутренняя ошибка при параллельной загрузке фотографий контактов
Мне нужно изменить фотографию контакта для большого количества контактов, используя клиент Python для API контактов Google 3.0
gdata==2.0.18
Код, который я запускаю:
client = gdata.contacts.client.ContactsClient(source=MY_APP_NAME)
GDClientAuth(client, MY_AUTH)
def _get_valid_contact(contact_id):
contact = client.GetContact(contact_id)
if contact.GetPhotoLink() is None:
# Generate a proper photo link for this contact
link = gdata.contacts.data.ContactLink()
link.etag = '*'
link.href = generate_photo_url(contact)
link.rel = 'http://schemas.google.com/contacts/2008/rel#photo'
link.type = 'image/*'
contact.link.append(link)
return contact
def upload_photo(contact_id, image_path, image_type, image_size):
contact = _get_valid_contact(contact_id)
try:
client.ChangePhoto(media=image_path,
contact_entry_or_url=contact,
content_type=image_type,
content_length=image_size)
except gdata.client.RequestError as req:
if req.status == 412:
#handle etag mismatches, etc...
pass
Учитывая список действительных идентификаторов контактов Google, если я последовательно запускаю метод upload_photo для каждого из них, все идет гладко, и все контакты получают свою фотографию:
for contact_id in CONTACT_ID_LIST:
upload_photo(contact_id, '/path/to/image', 'image/png', 1234)
Однако, если я попытаюсь загрузить фотографии параллельно (используя как минимум 4 потока), некоторые из них будут случайным образом завершаться с 500, возникла временная внутренняя проблема. Повторите попытку позже в ответ на вызов client.ChangePhoto. Я могу повторить эти фотографии позже, и они наконец обновятся:
from multiprocessing.pool import ThreadPool
pool = ThreadPool(4)
for contact_id in CONTACT_ID_LIST:
pool.apply_async(func=upload_photo,
args=(contact_id,'/path/to/image', 'image/png', 1234))
Чем больше потоков я использую, тем чаще происходит ошибка.
Единственная похожая проблема, которую я смог найти, это http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=2507, и она была решена некоторое время назад. Проблема, с которой я сталкиваюсь сейчас, может быть иной, так как это происходит случайно, и только при параллельном запуске обновлений. Таким образом, есть вероятность, что в какой-то момент в конце API Контактов Google может возникнуть состояние гонки.