2017-03-29 1 views
0

나는 데이터베이스에서 일부 데이터를 읽고 그래서 난 데이터를 대상으로 내가 보내드립니다 스레드에서 데이터베이스소켓은 스레드 구현

#main 
    while True: 
     cursor.execute("UPDATE `raw` SET `zombie`='"+zombieId+"' WHERE result='pending' AND protocol='tcp' AND zombie='0' LIMIT 1;") 
#  time.sleep(0.2) 
     cursor.execute("select * from raw WHERE `result`='pending' AND `protocol`='tcp' and `zombie`='"+zombieId+"' limit 1;") 

      if cursor.rowcount>0 : 
        waitedSig = cursor.fetchone() 
        time.sleep(0.2) 
        t = threading.Thread(target=sendData , args=((waitedSig),)) 
        t.start() 
        time.sleep(0.6) 
      else: 
        time.sleep(1) 

에서 데이터를 가져 TCP 소켓 에서 보내해야

def sendData(sig): 
     timedata = datetime.datetime.fromtimestamp(int(sig[16])) 
     devimei = sig[23] 
     devdate = timedata.strftime("%d%m%y") 
     devtime = timedata.strftime("%H%M%S") 
     lat= format(sig[2]) 
     lon= format(sig[3]) 
     satcount = format(sig[5]) 
     speed = format(sig[4]) 
     batery = format(sig[7]) 
     if sig[9]>1000: 
       band='00' 
     elif sig[9]>850: 
       band='02' 
     else: 
       band='01' 
     hdop = format(sig[10]) 
     gsmQ = format(sig[6]) 
     lac = format(sig[12]) 
     cid = format(sig[13]) 
str='$MGV002,'+devimei+',12345,S,'+devdate+','+devtime+',A,'+lat+',N,'+lon+',E,0,'+satcount+',00,'+hdop+','+speed+',0,,,432,11,'+lac+',' 
      try: 
        clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        result = clientsocket.connect(('ip',port)) 
        clientsocket.send(str) 
        data = clientsocket.recv(1024) 
        print(str(datetime.datetime.now())+' -> send completed :'+format(sig[0])) 
        clientsocket.close() 
      except: 
        print(str(datetime.datetime.now())+' -> connection to tcp server failed!!') 

이 정말 좋은 일을하지만, 거기에 두 가지 지루한 문제 :

1) 내가 0.2를 제거하고 경우 0.6 수면 스크립트를 지연 중복 소켓 사용으로 인해 충돌이 발생했습니다. 시스템이 이전에 작업을 마칠 때까지 다른 소켓을 열려고합니다! 어떤 것을 내가 수동으로 스크립트 그래서

1을 다시 시작할 때까지 sendData 기능으로, 전체 스크립트가 작동하지 잘못되면

2)) 내가 하나를 실행하는 스레드 큐를 만들 수 있습니다 다른 후 영향을주지 않습니다!

2) 내가 어떻게 그냥 특정 스레드 및 스크립트는 다음 데이터베이스 레코드와의 작업을 계속 닫 스레드 함수에서 오류를 처리 할 수 ​​있습니다!

+0

_ 중복 된 소켓 사용으로 인한 스크립트 충돌 _ 스택 추적이 있다는 뜻입니까? 해당 스택 추적을 게시 할 수 있습니까? – tdelaney

+0

루프가 이상합니다. 모든 것을 쿼리하고, 첫 번째 것을 보내고, 모든 것을 다시 쿼리하고, 첫 번째 것을 다시 보냅니다. – tdelaney

+0

스레드가 닫히기 전에 소켓을 종료하지 않는다는 것을 제외하면 중복 소켓을 얻는 방법을 알지 못합니다. 'clientsocket.shutdown (socket.SHUT_RDWR)'. – tdelaney

답변

1

이것은 스레드 풀의 좋은 응용 프로그램처럼 보입니다. 구현시 데이터베이스 테이블에 항목 당 하나의 쓰레드와 소켓을 생성하여 시스템에 극도로 과세 할 수 있습니다. 여기 예를 들어 20 명의 근로자를 만들었습니다. 시스템에 스트레스를 가하기 시작하면 근로자 수가 줄어 듭니다.

import multiprocessing.pool 

def sender(): 
    pool = multiprocessing.pool.ThreadPool(20) # pick your size... 
    cursor.execute("select * from database") 
    pool.map(sendData, cursor, chunksize=1) 

def sendData(sig): 
     try: 
       clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
       result = clientsocket.connect(('ip',port)) 
       clientsocket.sendall(sig) 
       data = clientsocket.recv(1024) 
       print(str(datetime.datetime.now())+' -> send completed :'+format(sig[0])) 
       clientsocket.shutdown(socket.SOCK_RDWR) 
       clientsocket.close() 
     except: 
       print(str(datetime.datetime.now())+' -> connection to tcp server fa 
+0

음, 포트 사용 중입니까? 그것은 아마도 서버 구성 방법에 대한 질문 일 것입니다. 보류중인 연결 수의 최대 값을 '수신 대기'합니다. 서버가 수용하는 것보다 더 큰 풀을 갖는 것은 그리 좋지 않습니다. 당신은 그 오류를 잡아 수 초 잠을 다시 시도하십시오. 그러면 서버가 할 수있는 일에 자연스럽게 적응할 수 있습니다. – tdelaney

+0

내 실수 .i 우리가 소켓을 듣고 다른 프로그램이 해당 포트를 너무 들으 려 할 때 포트 사용 중 오류가 발생했기 때문에 주석이 삭제되었습니다. 제공된 코드를 테스트하고 여기에서 업데이트하면 도움이됩니다. –