Ошибка слишком большого количества открытых файлов при одновременной обработке HTTP-запросов - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь параллельно использовать 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, я не сталкиваюсь с этой проблемой, но тогда в целом процесс идет медленно.

...