Python多进程与MySQL

0 投票
2 回答
4156 浏览
提问于 2025-04-16 16:48

我在网上查了很多资料,但还是找不到适合我需求的解决方案 :(

我有一个MySQL数据库,里面有一个表存储了超过10,000个电子邮件地址。

我想每5分钟对这些地址进行一次批处理操作。

我觉得用Python来从MySQL获取结果,然后用这些电子邮件地址作为参数调用命令行是个不错的选择。

我该怎么做才是最好的方式呢?我在想先从MySQL获取所有的结果集,然后让一群工作程序调用命令行,直到所有的电子邮件地址都处理完。这样能简单又稳定地实现吗?

2 个回答

0

如果你不想使用ORM模块,可以把邮件信息存到一个CSV文件里:

SELECT name, address
FROM email
INTO OUTFILE '/tmp/emails.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

来源:从命令行将MySQL数据库导出为纯文本(CSV)备份

然后可以用Python对这个CSV文件进行后续处理:

import csv
data = csv.reader(open('/tmp/emails.csv', 'rb'), delimiter=',')
for row in data:
    name, address = row
    print '%s <%s>' % (name, address)

CSV文件的读写:http://docs.python.org/library/csv.html

如果你处理的是非常大的文件,建议使用file.readlines()这个函数,这样可以避免Python把整个文件都读到内存里:

with open('/tmp/emails.csv', 'rb') as f:
    for line in f.readlines():
        name, address = line.split(',')
        print '%s <%s>' % (name, address)
0

你可以像这样使用多进程模块:

from multiprocessing import Pool
p = Pool()    # let python choose the optimal number of processes (= number of CPU cores)
def treat_email(email_adress):
    # do the stuff you need with email address

email_addresses = grab_the_list_from_mysql()  # something like "select mail from my_user_table"

p.map(treat_email, email_addresses)    # this will treat all the emails in the X processes

撰写回答