Python redis连接中的socket.getaddrinfo引发OSError:[Errno 16]设备或资源正忙
说明: 我有一个小型图像服务器,您可以在其中设置来自两个不同设备的图像名称1和图像名称2,服务器显示由这两个名称组成的图像路径。例如,设备1将图像1设置为foo,设备2将图像2设置为bar,然后服务器将显示图像foo_bar.png,并使用redis pub sub机制和SSE重新加载浏览器。下面是映像服务器的代码:Python redis连接中的socket.getaddrinfo引发OSError:[Errno 16]设备或资源正忙,python,ubuntu,flask,redis,raspberry-pi4,Python,Ubuntu,Flask,Redis,Raspberry Pi4,说明: 我有一个小型图像服务器,您可以在其中设置来自两个不同设备的图像名称1和图像名称2,服务器显示由这两个名称组成的图像路径。例如,设备1将图像1设置为foo,设备2将图像2设置为bar,然后服务器将显示图像foo_bar.png,并使用redis pub sub机制和SSE重新加载浏览器。下面是映像服务器的代码: from flask import Flask, render_template, Response import os import redis app = Flask(__n
from flask import Flask, render_template, Response
import os
import redis
app = Flask(__name__)
pool = redis.ConnectionPool(host="localhost", port=6379)
red = redis.StrictRedis(connection_pool=pool)
@app.route("/")
@app.route("/get_image")
def get_image():
image_1_name = app.config['image_1_name']
image_2_name = app.config['image_2_name']
image_exists = False
image_name = "{} {}.png".format(image_1_name, image_2_name)
if image_1_name != "'-'" and image_2_name != "'-'":
image_path = os.path.join("static", image_name)
if os.path.isfile(image_path):
image_exists = True
return render_template("image_server.html", image_path=image_name, image_exists=image_exists)
@app.route("/set_image/<sign1>/<sign2>")
def set_image(sign1, sign2):
image_name = "{} {}.png".format(sign1, sign2)
app.config['image_name'] = image_name
red.publish("chat", "Reload")
return {"success": True}
@app.route("/set_image_n/<n>/<sign>")
def set_image_n(n, sign):
app.config[f'image_{n}_name'] = sign
red.publish("chat", "Reload")
return {"success": True}
def event_stream():
pubsub = red.pubsub()
pubsub.subscribe('chat')
for message in pubsub.listen():
yield 'data: %s\n\n' % message['data']
@app.route('/stream')
def stream():
return Response(event_stream(), mimetype="text/event-stream")
if __name__ == '__main__':
app.config['image_name'] = "'-'"
app.config['image_1_name'] = "'-'"
app.config['image_2_name'] = "'-'"
app.run(host="0.0.0.0", debug=False, use_reloader=False, threaded=True)
现在,当让这个循环运行数千次调用时,一切都按预期进行,但过一段时间后,在问题发生之前,它可能是几百次调用或几千次调用,我得到以下stacktrace:
127.0.0.1 - - [10/May/2021 17:09:44] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:44] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
127.0.0.1 - - [10/May/2021 17:09:44] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:45] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
192.168.254.18 - - [10/May/2021 17:09:45] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.13 - - [10/May/2021 17:09:45] "[37mGET /set_image_n/1/60 HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:45] "[37mGET / HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:45] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:46] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
127.0.0.1 - - [10/May/2021 17:09:46] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:46] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
192.168.254.18 - - [10/May/2021 17:09:46] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.27 - - [10/May/2021 17:09:47] "[37mGET /set_image_n/2/60 HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:47] "[37mGET / HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:47] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:48] "[36mGET /static/60%2060.png HTTP/1.1[0m" 304 -
127.0.0.1 - - [10/May/2021 17:09:48] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:48] "[36mGET /static/60%2060.png HTTP/1.1[0m" 304 -
192.168.254.18 - - [10/May/2021 17:09:48] "[37mGET /stream HTTP/1.1[0m" 200 -
[2021-05-10 17:09:48,817] ERROR in app: Exception on /set_image_n/1/60 [GET]
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 559, in connect
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 584, in _connect
File "/usr/lib/python3.9/socket.py", line 953, in getaddrinfo
OSError: [Errno 16] Device or resource busy
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
File "/home/usr/project/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
File "/home/usr/project/src/project/image_server.py", line 35, in set_image_n
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 3098, in publish
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 898, in execute_command
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 1192, in get_connection
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 563, in connect
redis.exceptions.ConnectionError: Error 16 connecting to localhost:6379. Device or resource busy.
192.168.254.13 - - [10/May/2021 17:09:48] "[35m[1mGET /set_image_n/1/60 HTTP/1.1[0m" 500 -
[2021-05-10 17:09:49,815] ERROR in app: Exception on /set_image_n/2/80 [GET]
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 559, in connect
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 584, in _connect
File "/usr/lib/python3.9/socket.py", line 953, in getaddrinfo
OSError: [Errno 16] Device or resource busy
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
File "/home/usr/project/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
File "/home/usr/project/src/project/image_server.py", line 35, in set_image_n
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 3098, in publish
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 898, in execute_command
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 1192, in get_connection
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 563, in connect
redis.exceptions.ConnectionError: Error 16 connecting to localhost:6379. Device or resource busy.
我的问题是什么资源或设备正忙?redis服务器还是端口?为什么它可以运行数千个电话,但一旦忙了,它就永远忙下去?我的主要问题是,它不会自行恢复,在某些电话中占线是可以的,但在它占线后,它会一直占线
版本:
redis:6.0.11
redis py:3.5.3
平台:什么平台/版本?(例如Windows7/Ubuntu 15.10/Azure上的Python 3.5.1)
运行Python 3.9.4的raspberry pi 4B上的Ubuntu 21.04
ulimit:无限
cat/proc/sys/fs/inotify/max_user_手表65536
import time
import requests
counter = 0
url = "192.168.254.181"
while True:
if counter % 10 == 0:
print(counter)
requests.get(f"http://{url}:5000/set_image_n/1/60")
counter += 1
time.sleep(1)
127.0.0.1 - - [10/May/2021 17:09:44] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:44] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
127.0.0.1 - - [10/May/2021 17:09:44] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:45] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
192.168.254.18 - - [10/May/2021 17:09:45] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.13 - - [10/May/2021 17:09:45] "[37mGET /set_image_n/1/60 HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:45] "[37mGET / HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:45] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:46] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
127.0.0.1 - - [10/May/2021 17:09:46] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:46] "[36mGET /static/60%2080.png HTTP/1.1[0m" 304 -
192.168.254.18 - - [10/May/2021 17:09:46] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.27 - - [10/May/2021 17:09:47] "[37mGET /set_image_n/2/60 HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:47] "[37mGET / HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:47] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [10/May/2021 17:09:48] "[36mGET /static/60%2060.png HTTP/1.1[0m" 304 -
127.0.0.1 - - [10/May/2021 17:09:48] "[37mGET /stream HTTP/1.1[0m" 200 -
192.168.254.18 - - [10/May/2021 17:09:48] "[36mGET /static/60%2060.png HTTP/1.1[0m" 304 -
192.168.254.18 - - [10/May/2021 17:09:48] "[37mGET /stream HTTP/1.1[0m" 200 -
[2021-05-10 17:09:48,817] ERROR in app: Exception on /set_image_n/1/60 [GET]
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 559, in connect
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 584, in _connect
File "/usr/lib/python3.9/socket.py", line 953, in getaddrinfo
OSError: [Errno 16] Device or resource busy
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
File "/home/usr/project/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
File "/home/usr/project/src/project/image_server.py", line 35, in set_image_n
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 3098, in publish
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 898, in execute_command
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 1192, in get_connection
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 563, in connect
redis.exceptions.ConnectionError: Error 16 connecting to localhost:6379. Device or resource busy.
192.168.254.13 - - [10/May/2021 17:09:48] "[35m[1mGET /set_image_n/1/60 HTTP/1.1[0m" 500 -
[2021-05-10 17:09:49,815] ERROR in app: Exception on /set_image_n/2/80 [GET]
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 559, in connect
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 584, in _connect
File "/usr/lib/python3.9/socket.py", line 953, in getaddrinfo
OSError: [Errno 16] Device or resource busy
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
File "/home/usr/project/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
File "/home/usr/project/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
File "/home/usr/project/src/project/image_server.py", line 35, in set_image_n
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 3098, in publish
File "/home/usr/project/lib/python3.9/site-packages/redis/client.py", line 898, in execute_command
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 1192, in get_connection
File "/home/usr/project/lib/python3.9/site-packages/redis/connection.py", line 563, in connect
redis.exceptions.ConnectionError: Error 16 connecting to localhost:6379. Device or resource busy.