2017-11-02 10 views
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() 

답변

0

나는 가장 간단한 방법은 기능에 루프를 감싸고 multiprocessing.dummy 스레드 풀을 사용하여 생각합니다.

+0

답변을 주셔서 감사합니다. 그러나 커서를 병렬화하면 실행되는 쿼리가 동일하지만 여러 스레드에서 실행되므로 속도가 증가하지 않으므로 이해할 수 없습니까? –

+0

주요 질문은 프로그램의 병목 현상입니까? 그것이'popen'에 있다면 - 예, 다른 쓰레드의 다중 핑은 실행 속도를 증가시킵니다. 결과를 데이터베이스에 삽입 할 때 병목 현상이 발생하면 먼저 각 쿼리 후에 'commit'을 실행하지 마십시오. 여러 삽입 작업 후에 커밋을 시도하십시오. –