Я пытаюсь параллельно использовать API Google Vision для извлечения похожих / идентичных изображений, соответствующих списку из 100 тыс. URL-адресов изображений, которые у меня есть.
Я использую этот код:
from urlparse import urlparse
from threading import Thread
import httplib, sys
from Queue import Queue
import csv
import argparse
import io
from google.cloud import vision
from google.cloud.vision import types
concurrent = 10
q = Queue(concurrent * 2)
file = open("in.tsv", "r")
csvfile = open("outFinal.tsv", 'w+')
writer = csv.writer(csvfile, delimiter='\t')
writer.writerow(['imagePath','MatchedProductURL'])
def doWork():
while True:
imageUrl = q.get()
response, url = getStatus(imageUrl)
doSomethingWithResult(response,url)
q.task_done()
def getStatus(ourl):
try:
client = vision.ImageAnnotatorClient()
response = client.annotate_image({'image': {'source': {'image_uri': ourl}},'features':[{'type':'WEB_DETECTION','max_results':200}]})
return response, ourl
except:
return "error", ourl
def doSomethingWithResult(response,url):
if response!='error':
for page in response.web_detection.pages_with_matching_images:
allFields = []
allFields.append(url)
allFields.append(page.url)
writer.writerow(allFields)
for i in range(concurrent):
t = Thread(target=doWork)
t.daemon = True
t.start()
try:
for line in file:
q.put(line)
q.join()
except KeyboardInterrupt:
sys.exit(1)
Но я начинаю получать эту ошибку через некоторое время
E0528 01:18:47.878202000 123145568137216 wakeup_fd_pipe.cc:40] pipe creation failed (24): Too many open files
E0528 01:18:47.878229000 123145568137216 ev_poll_posix.cc:942] pollset_work: {"created":"@1590608927.878220000","description":"Too many open files","errno":24,"file":"src/core/lib/iomgr/wakeup_fd_pipe.cc","file_line":41,"os_error":"Too many open files","syscall":"pipe"}
E0528 01:18:47.878234000 123145568137216 completion_queue.cc:1065] Completion queue next failed: {"created":"@1590608927.878220000","description":"Too many open files","errno":24,"file":"src/core/lib/iomgr/wakeup_fd_pipe.cc","file_line":41,"os_error":"Too many open files","syscall":"pipe"}
Я что-то упускаю? Это зависит от количества одновременных подключений? Но, по моему мнению, это также будет максимум 10. Когда я доживаю до 1, я не сталкиваюсь с этой проблемой, но тогда в целом процесс идет медленно.