我第一次使用Python multiprocessing
来启动一定数量的进程(8),以便在大量表(大约1000个表)上定期运行一些查询。
应定期运行每个查询。例如,每300秒。
当然,我想创建一个数据库连接池来共享这些进程之间的数据库连接。
正如您在下面的代码中看到的,我为每个表创建了一个进程。我使用cx_Oracle
创建了一个池,并在进程开始执行查询之前使用acquire()
,并在执行完它时使用release()
。
这大致是我现在所拥有的:
import cx_Oracle
import multiprocessing as mp
class OracleWatcher(mp.Process):
"""Oracle Data Base Watcher."""
def __init__(self, process_config):
"""Initialisation."""
self.table_name = process_config["table_name"]
self.query_str = process_config["query_str"]
self.check_interval = process_config["check_interval"]
super(OracleWatcher, self).__init__()
def run(self):
"""Run method. Executed when creating a Process."""
db_connection = pool.acquire()
result = self.run_my_query(self.table_name, self.query_str)
pool.release(db_connection)
time.sleep(self.check_interval)
self.run()
return
db_user = get_database("user")
db_pass = get_database("pass")
db_host = get_database("host")
db_port = get_database("port")
db_name = get_database("name")
dsn_str = cx_Oracle.makedsn(db_host, db_port, db_name)
max_pool_size = 8 # 8 processes can use the connection pool simultaneously
pool = cx_Oracle.SessionPool(user=db_user,
password=databases_info["DB1"]['pass'],
dsn=dsn_str,
min=min_pool_size,
max=max_pool_size,
increment=increment)
jobs = []
database_tables = get_database_tables()
for database_table in database_tables:
table_config_dict = {}
table_config_dict["check_interval"] = get_table_name()
table_config_dict["check_interval"] = get_check_interval()
table_config_dict["query_str"] = get_query_str()
proc = OracleWatcher(table_config_dict)
jobs.append(proc)
proc.start()
for j in range(len(jobs)):
jobs[j].join()
仅仅使用acquire()
和release()
来共享进程之间的连接并且只允许其中的8个同时使用它就足够了吗?我错过了什么吗?我是否需要使用multiprocessing.Queue()
?