0
멀티 스레딩에서 프로그램을 변환하려고 검색하지만 수행 방법을 말하지 않습니다. 사실, 나는 2 가지 해결책을 생각했지만 더 최적이라고 생각하지 않는다 : 파이썬에서 배열로 결과를 선택하여 저장하고 스레드별로 범위별로 필터링한다. 또는 선택 항목이 스레드별로 하나의 도메인 만 갖는 다중 스레드 루프에서 직접 생성하는 더 좋은 방법이 있습니까?쿼리 sql을 실행하기위한 루프에서 파이썬 다중 스레딩
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()
가 데이터베이스에 멀티 스레드에 액세스하는 데 필요한 추가 잠금 될 수있다
#!/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()
답변을 주셔서 감사합니다. 그러나 커서를 병렬화하면 실행되는 쿼리가 동일하지만 여러 스레드에서 실행되므로 속도가 증가하지 않으므로 이해할 수 없습니까? –
주요 질문은 프로그램의 병목 현상입니까? 그것이'popen'에 있다면 - 예, 다른 쓰레드의 다중 핑은 실행 속도를 증가시킵니다. 결과를 데이터베이스에 삽입 할 때 병목 현상이 발생하면 먼저 각 쿼리 후에 'commit'을 실행하지 마십시오. 여러 삽입 작업 후에 커밋을 시도하십시오. –