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/

相关文章:

php - 没有全文支持;必须有有效的 mysql 数据库搜索引擎;哪里可以找到?

MYSQL根据不同条件对列进行分组查询

arrays - 如何将 Swift 数组作为参数传递给线程?

Android守护线程测试

python - 保存部分 sklearn 管道

python - Google Distance Matrix API GPS坐标搜索

python - 从子字符串中查找文件名

java - 如何在 Hibernate SessionFactory 创建新连接后立即运行 SQL 查询?

c# - 从用户界面调用System.Threading.Thread时,锁将挂起。

python - 在两列上使用 Pandas 分解