用于执行查询sql的循环中的Python多线程

用于执行查询sql的循环中的Python多线程,python,multithreading,python-multiprocessing,Python,Multithreading,Python Multiprocessing,我试图在多线程中转换我的程序,但我没有说如何做。事实上,我想到了两种解决方案,但我认为这不是最理想的: 在python中执行选择并将结果存储在数组中,然后按线程的范围进行过滤。 或具有子句id的多线程,以便select每个线程只有一个域 有没有更好的方法直接在循环中实现这一点 #!/usr/bin/python import mysql.connector as mariadb from subprocess import Popen, PIPE, STDOUT import re import

我试图在多线程中转换我的程序,但我没有说如何做。事实上,我想到了两种解决方案,但我认为这不是最理想的: 在python中执行选择并将结果存储在数组中,然后按线程的范围进行过滤。 或具有子句id的多线程,以便select每个线程只有一个域 有没有更好的方法直接在循环中实现这一点

#!/usr/bin/python
import mysql.connector as mariadb
from subprocess import Popen, PIPE, STDOUT
import re
import os

mariadb_connection = mariadb.connect(user='root', password='xxxx', database='xxxx');
cursor = mariadb_connection.cursor(buffered=True)
#retrieving information

cursor.execute("SELECT Domain,Id FROM classement where Domain like '%com';")

for Domain,Id in cursor:
          counter=0
          for character in Domain:
                if (character == "."):
                        counter = counter + 1
                        if (counter==1):
                            print(Domain)
                            pingresult = Popen(['ping','-c','3', Domain], stdout=PIPE, stderr=STDOUT).communicate()[0]
                            pingresult=str(pingresult)
                            ping = pingresult.find('min/avg/max/mdev')
                            ping=pingresult[ping+19:-6]
                            print(ping)
                            cursor.execute('update classement set Ping = "%s" where Domain = "%s";' % (ping,Domain))
                            mariadb_connection.commit()
mariadb_connection.close()

我认为最简单的方法是在函数中包装您的循环并使用线程池:

from multiprocessing.dummy import Pool
...
cursor.execute( ... )
...

def process (entry):
    Domain,Id = entry
    ...
    # your code there
    ...
    cursor.execute( ... )
    mariadb_connection.commit()

pool = Pool(os.cpu_count())
# or may be N*os.cpu_count() if ping waits for
# network interaction too long

pool.map(process, cursor)
pool.join()

多线程访问数据库可能需要额外的锁定。

谢谢您的回答,但我不明白,因为如果我并行化游标,执行的查询是相同的,但由多个线程执行,因此我不会提高速度。否?主要问题是您的程序是否存在瓶颈?如果在
popen
-是,在不同线程中多次ping将提高执行速度。如果在将结果插入数据库时遇到瓶颈,首先不要在每次查询后执行
commit
。尝试在多次插入操作后执行提交。