python - 在 Python 中线程多个 SQL 查询的良好实践/设计是什么

标签 python mysql multithreading

我正在使用 Python 从网站提取信息并将其存储到数据库 MySQLdbBeautifulSoup .

该网站由大约 15 个不同的城市组成,每个城市都有 10 到 150 个页面。总共约500页。

对于每个城市的每个页面,我使用 BeautifulSoup 打开网站,提取所有必要的信息,然后执行 insert intoupdate SQL 查询。

目前我没有使用线程,浏览完所有 500 个页面需要几分钟,因为 Python 程序...

  1. 打开一个页面。
  2. 提取信息。
  3. 执行 SQL 查询。
  4. 打开下一页...

理想情况下,我希望通过 10 个并发线程(每个线程打开大约 50 个页面)来负载平衡线程。但我认为这可能太复杂而无法编码。

所以我正在考虑每个城市有一个线程。我该如何实现这个目标?

目前我的代码看起来像这样:

//import threading
import BeautifulSoup
import urllib2
import MySQLdb

con = MySQLdb.connect( ... )

def open_page( url ):
    cur = con.cursor()
    // do SQL query

//Get a dictionary of city URL

cities = [
    'http://example.com/atlanta/',
    'http://example.com/los-angeles/',
    ...
    'http://example.com/new-york/'
]

for city_url in cities:
    soup = BeautifulSoup( urllib2.urlopen( city_url ) )

    // find every page per city
    pages = soup.findAll( 'div', { 'class' : 'page' } )

    for page in pages:
        page_url = page.find( 'a' )[ 'href' ]
        open_page( page_url )

最佳答案

你最初的想法是绝对可行的。只需启动 10 个工作线程,等待同一个队列上的输入。然后您的邮件进程将 URL 放入此队列中。负载平衡将自动发生。

如果您的 SQL 绑定(bind)是线程安全的,您可以在工作线程中执行 INSERT 或 UPDATE 操作。否则,我会为 SQL 内容添加一个线程,等待不同队列上的输入。然后,您的工作线程会将查询放入此队列中,然后 SQL 线程将执行它。

如果您在 google 上搜索“python 工作线程队列”,您会找到一些示例。

关于python - 在 Python 中线程多个 SQL 查询的良好实践/设计是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217367/

相关文章:

python - Django 通用关系错误 : "cannot resolve keyword ' content_object' into field"

php - Joomla 可以处理 jos_users 表中数百万用户的查询吗?

php - 将 Symfony 3 应用程序连接到( Asterisk 服务器)中的外部 SQL 数据库

java - java进程中有很多线程

java - 如何在运行时更新 ThreadPoolExecutor 线程池大小

python - python中有什么方法可以从数据框中搜索模式并提取其相应的值吗?

python - 在自定义损失函数中迭代张量

python - 如何在 sympy 中指定非负实数

mysql - Wordpress 不适用于 docker compose

c# - 没有锁定的最佳并发线程共享内存架构是什么?