Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用带多处理模块的python redis_Python_Redis_Multiprocessing_Connection Pooling - Fatal编程技术网

使用带多处理模块的python redis

使用带多处理模块的python redis,python,redis,multiprocessing,connection-pooling,Python,Redis,Multiprocessing,Connection Pooling,我是PythonRedis模块的新手,我正在寻找一种在使用python多处理模块时有效地共享连接的方法。我的代码如下: import multiprocessing as mp import Queue import os import time import redis def _process_messages_parallel(messages): processes=[mp.Process(target=_process_message, args=[message]) for

我是PythonRedis模块的新手,我正在寻找一种在使用python多处理模块时有效地共享连接的方法。我的代码如下:

import multiprocessing as mp
import Queue
import os
import time
import redis

def _process_messages_parallel(messages):
    processes=[mp.Process(target=_process_message, args=[message]) for message in messages]

    for process in processes:
        process.daemon=False
        process.start()

    for process in processes:
        process.join()


def _process_message(message):
    organization=message['organization']

    #get value associated with `organization` key from redis
    result=get_val_from_redis(organization)

    #process result

#assume local redis instance for now.
def get_val_from_redis(organization,host='localhost',port='6379'):
    conn=redis.StrictRedis(host=host,port=port,db=db,retry_on_timeout=retry_on_timeout) 
    return conn.get(organization)


if __name__=="__main__":
    messages=[{'organization':'org1'},{'organization':'org2'},{'organization':'org3'},...{'organization':'orgN'}]
    process_articles=mp.Process(target=_process_messages_parallel,args=[messages])
    process_articles.daemon=False 
    process_articles.start()
    process_articles.join()

在这里,我想在由
\u process\u messages\u parallel
函数创建的不同进程之间重新使用相同的连接池。有人能提出一个好办法吗?一个简单的解决方案可能是创建模块范围的redis连接池或函数范围的redis连接池,但我关心的是不同进程之间如何共享python模块/或python函数。如果为每个进程创建一个单独的对象副本,那么它是否超出了连接池的用途

您不应该(也可能不能)在进程之间共享连接池。只需使用每个进程池,将每个进程中的连接数限制在最小值即可。@Not_a_Golfer嗯,这是我目前所做的。但对这个解决方案并不太满意。如果进程的寿命很短(在我的例子中就是这样),并且是定期创建和销毁的,那么我猜创建到redis实例的每个连接的费用加起来相当可观。因此,重构代码,使进程在一个进程池和一个队列中能够长期存在