나는 데이터베이스에서 일부 데이터를 읽고 그래서 난 데이터를 대상으로 내가 보내드립니다 스레드에서 데이터베이스소켓은 스레드 구현
#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) 내가 어떻게 그냥 특정 스레드 및 스크립트는 다음 데이터베이스 레코드와의 작업을 계속 닫 스레드 함수에서 오류를 처리 할 수 있습니다!
_ 중복 된 소켓 사용으로 인한 스크립트 충돌 _ 스택 추적이 있다는 뜻입니까? 해당 스택 추적을 게시 할 수 있습니까? – tdelaney
루프가 이상합니다. 모든 것을 쿼리하고, 첫 번째 것을 보내고, 모든 것을 다시 쿼리하고, 첫 번째 것을 다시 보냅니다. – tdelaney
스레드가 닫히기 전에 소켓을 종료하지 않는다는 것을 제외하면 중복 소켓을 얻는 방법을 알지 못합니다. 'clientsocket.shutdown (socket.SHUT_RDWR)'. – tdelaney