业务:有大量(本次测试时 1
万多张)图片需要转成 base64
编码后,送入 http
接口请求处理,我采用以下代码: base64
用生成器处理, request
用多进程。 但下面代码跑到一半的时候,直接抛了 OSError: [Errno 24] Too many open files
, 百度了一下,看上去是进程超过所能开启的最大文件数了, ulimit -n # mac 8192
请教下各位,我怎么应该 fix
这个问题,最终需求就是想快速高效的完成这个操作,可能我写的代码一开始就有问题,还希望大佬们指点一下。
import json
import time
import requests
import base64
import os
from multiprocessing import Process
def img_to_base64(img_path):
r = {}
for root, dirs, files in os.walk(img_path):
for pic in files:
if pic.endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):
img = os.path.join(root, pic)
with open(img, 'rb') as f:
bs64 = base64.b64encode(f.read()).decode('utf-8')
r[img] = bs64
yield r
def req(host, img_path):
bs64_generator = img_to_base64(img_path)
procs = []
for items in bs64_generator:
body, pic = None, None
for pic, base64 in items.items():
body = {
"requests": [
{
"resource": {
"base64": base64
}
}
]
}
p = Process(target=r, args=(host, body, pic))
procs.append(p)
p.start()
for proc in procs:
proc.join()
def r(host, body, img):
url = f'http://{host}/demo/'
r = requests.post(url, data=json.dumps(body))
print(img, r.json().get('results'))
ret = r.json().get('results')[0]['status']
if ret != 'OK':
print(img, ret)
req('10.10.23.17:3345', './mypic/')
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.