Redis 服务器在多线程 Perl 脚本中响应“资源暂时不可用”

问题描述 投票:0回答:2

我正在 Perl 中开发一些使用线程(最多 10 个)的脚本;每个线程读取一个文件,处理每一行并将每行结果保存在 Redis 的列表或哈希表中。一切都工作正常,直到线程超过 15 个,一些线程死亡,另一些线程执行它们必须执行的操作。这是我收到的错误:

Thread 2 terminated abnormally: Error while reading from Redis server: Resource temporarily unavailable at /Library/Perl/5.10.0/Redis.pm line 518 thread 2

正如消息所说,Redis 服务器位于顶部。错误从这里开始(没有什么异常):

$self->{_redis}->rpush($key, $data);

我正在使用 Redis 2.4.14 和 Pedro Melo 的 Redis for Perl 包。

您认为这是处理该数据结构的好方法吗?我的意思是,将 Redis 与线程一起使用?还有别的好办法吗?或者我应该怎么做才能解决这个问题?

提前致谢!

multithreading perl redis
2个回答
2
投票
我的错误是我只建立了一个连接并在每个线程中使用该连接。 解决方案:每个线程与 Redis 服务器建立连接。

感谢 Didier Spezia 提供的解决方案。


0
投票
我遇到了同样的问题,但使用的是 C++ 版本的 Redis 客户端。我试图在获取 ~100 个键时重用来自 16 个不同线程的一个连接。

就我而言,它有助于增加参数

socket_timeout

connect_timeout

sw::redis::ConnectionOptions opt; opt.host = host; opt.port = port; opt.socket_timeout = REDIS_SOCKET_TIMEOUT; opt.connect_timeout = REDIS_CONNECTION_TIMEOUT;

https://github.com/sewenew/redis-plus-plus/issues/604

Redis 客户端库的 Perl 版本还允许控制超时。

© www.soinside.com 2019 - 2024. All rights reserved.