【发布时间】:2019-10-18 14:40:06
【问题描述】:
我正在为一个可以发送大量电子邮件的项目工作。我目前每 1:06 秒有 100 封电子邮件。我认为它可以在一分钟或更短的时间内完成。你有什么建议吗?
我已经使用过线程/多线程,但当然是“GIL”。 我也完成了多处理。这就是我得到 1:06 秒的地方,然后池化 1:07 秒
def sendMail(z,x,c):
startti=datetime.datetime.now()
server.sendmail(z,x,c)
timenow= datetime.datetime.now()
print (timenow-startti).total_seconds()
def multiprocessing_func(x):
cursor.execute(query)
starttime=datetime.datetime.now()
while True:
result=cursor.fetchone()
if result==None:
break
subject=str(result[1])
sendto=str(result[2])
msg=MIMEMultipart('mixed')
msg['from']=mail_sender
msg['to']=sendto
msg['subject']=subject
part_text=MIMEText(html, 'html')
msg.attach(part_text)
msg.attach(file1)
sendMail(msg['from'],msg['to'],msg.as_string())
endtime=datetime.datetime.now()
print'%s'%(endtime-starttime)
if __name__ == '__main__':
processes=[]
for i in range(1):
p=multiprocessing.Process(target=multiprocessing_func, args=(i,))
processes.append(p)
p.start()
for process in processes:
process.join
【问题讨论】:
-
因为你是 `for i in range(1):` 你一次启动一个进程。所以它实际上是连续的。尝试更大的数字,例如 ` for i in range(20):`
-
如果我把它设为 20,它会调用整个表 20 次
-
您需要重组您的代码,以便 1)
multiprocessing_func只需要一个 to_email 和主题来发送电子邮件 2) 将数据库查询逻辑从multiprocessing_func移动到__main__。 -
最好的办法是使用异步IO,这样就不会阻塞网络调用。如果您自己拨打电话,请查看 aiohttp 或 aiosmtpd。如果你正在使用一些模块抽象发送邮件,请尝试找到一个可以进行异步操作的模块。
-
我只使用 mysql.connector 和多处理模块 hoodakaushal
标签: python python-2.7 multiprocessing mariadb