在python中,使用redis-py和多处理模块,为什么每个进程都有不同的fd?

时间:2016-05-16 09:59:50

标签: python linux python-2.7 redis redis-py

在python中,使用redis-py和多处理模块,为什么每个进程都有不同的fd?

测试代码:

    # xiaorui.cc

import time
import multiprocessing

import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0)

def func(msg):
    for i in xrange(30):
        time.sleep(1)
        print r.keys()
    return "done " + msg


if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=4)
    result = []
    for i in xrange(4):
        msg = "hello %d" %(i)
        result.append(pool.apply_async(func, (msg, )))
    pool.close()
    pool.join()
    for res in result:
        print res.get()
    print "Sub-process(es) done."

测试结果:

[ruifengyun@xiaorui.cc ~]$ ps aux f|grep a.py
508      11704  5.0  0.0 421096 11664 pts/11   Sl+  17:50   0:00  |           \_ python a.py
508      11709  0.0  0.0 193760  7464 pts/11   S+   17:50   0:00  |               \_ python a.py
508      11710  0.0  0.0 193760  7468 pts/11   S+   17:50   0:00  |               \_ python a.py
508      11711  0.0  0.0 193760  7468 pts/11   S+   17:50   0:00  |               \_ python a.py
508      11712  0.0  0.0 193760  7476 pts/11   S+   17:50   0:00  |               \_ python a.py
508      11720  0.0  0.0 103248   832 pts/12   S+   17:50   0:00              \_ grep a.py
[ruifengyun@xiaorui.cc ~]$ sudo lsof -p 11709|grep 6379
python  11709 ruifengyun    4u  IPv4 4173927407      0t0        TCP localhost:51433->localhost:6379 (ESTABLISHED)
[ruifengyun@xiaorui.cc ~]$ sudo lsof -p 11710|grep 6379
python  11710 ruifengyun    4u  IPv4 4173927417      0t0        TCP localhost:51435->localhost:6379 (ESTABLISHED)
[ruifengyun@xiaorui.cc ~]$ sudo lsof -p 11711|grep 6379
python  11711 ruifengyun    4u  IPv4 4173927411      0t0        TCP localhost:51434->localhost:6379 (ESTABLISHED)
[ruifengyun@xiaorui.cc ~]$ sudo lsof -p 11712|grep 6379
python  11712 ruifengyun    4u  IPv4 4173927416      0t0        TCP localhost:51436->localhost:6379 (ESTABLISHED)

为什么每个进程的redis conn fd不同?在我的认知中,只有在懒惰模式下创建redis连接,才会出现不同的redis fd。

并且,所有子进程都是共享对象(redis conect fd)。

1 个答案:

答案 0 :(得分:0)

每个进程都需要单独连接到Redis。并且单个出站端口仅由单个进程使用。所以每个进程都有自己的端口。