我有一个非常基本的应用程序,通过套接字连接一次下载一个记录从服务器上获取数据,并将每个记录写入postgresql数据库。这只是我自己使用的。
downloader = DataDownloader.Downloader()
con = psycopg2.connect(datebase='db', user='username', password='pswrd')
downloader.get_data(con)
con.close()
在上面的代码中,我将psycopg2连接传递给一个类的实例,然后该类执行所有的下载和数据库更新操作。
问题在于,由于在
get_data()
中,该类每次只下载一条记录,因此该过程非常缓慢。我已经开始改变这种情况以包含线程:downloader = DataDownloader.Downloader()
records_to_download = 'abc'
thread1 = threading.Thread(target=downloader.get_data, args=(records_to_download))
thread1.start()
records_to_download = 'xyz'
thread2 = threading.Thread(target=downloader.get_data, args=(records_to_download))
thread2.start()
records_to_download = 'ghj'
thread3 = threading.Thread(target=downloader.get_data, args=(records_to_download))
thread3.start()
我所做的只是再次创建了一个单一的
downloader
实例,然后创建了3个线程,每个线程通过传递指定要下载的记录的参数来运行get_data
。我没有创建psycopg2连接并将其传递给
get_data
,而是在get_data
中创建了连接,以便每个线程都有自己的连接。我的问题是,这样是否足够并且正确地确保所有线程同时与数据库“友好”交互?每个线程仍在使用相同的用户名/密码访问数据库。我已确保每个线程将通过传递
records_to_download
参数来更新不同的记录。我听说过连接池,但对于像这样的单用户、多线程设置,这是否过度?(我从未使用过连接池,我的数据库知识非常基础,...因此如果这不是必需的,我会避免使用它)。
最后,我可以在被迫使用更为强大的方法(如连接池)之前使用多少线程?或者连接池是否从一开始就是必需的?