2017-03-01 1 views
1

우선, 나는 메모리 오류를 아는 것조차 몰랐다./segfault는 파이썬에서 가능했다. 새로운 것을 배우기위한 명성!파이썬 분할 오류?

나는이 데이터베이스 내가

database = DBManager(dbEndpoint,dbUser,dbPass,dbSchema) 

만들 수있는 그리고 내가 스레드에서 사용하려고

def stateTimeThreadStart(): 
    database.getTable('CLIENTS') 

threads = [] 
threads.append(threading.Thread(name='State Updater', target=stateTimeThreadStart, args=())) 
threads[0].start() 

출력은

Segmentation fault: 11 

가 도대체 ​​일입니다 이리? 그것은 분명히 database.getTable ('CLIENTS')과 관련이 있습니다. 왜냐하면 내가 주석 처리 할 때 문제가 발생하지 않기 때문입니다. 또한, 나는 행운이없는 쓰레드에 데이터베이스를 전달하려고 시도했다. 어떤 아이디어?

감사합니다.

+2

아마도 데이터베이스 항목은 작성되지 않은 스레드에서 실행되는 것을 좋아하지 않습니다. 내 첫 번째 추측 일 것입니다. 그리고 그렇습니다, segfaults는 가능합니다. 그것은 덮개 아래있는 C입니다. – paxdiablo

+0

'CLIENTS' 테이블이 차지하는 공간은 얼마입니까? 어쩌면 당신의 문제입니다. 왜냐하면 당신이 가지고있는 RAM보다 더 많은 메모리를 소비하는 테이블을 가져올 수 있기 때문입니다. –

+0

@paxdiablo 나는 그 감사를 시도 할 것이다! 구 가스에서 약 300 줄 :) – k9b

답변

2

데이터베이스 커넥터 때문에 파이썬의 세그먼트 오류가 발생할 수 있습니다. 데이터베이스에 연결하는 데 사용되는 드라이버는 일반적으로 C 기반으로 코딩되기 때문에 RAM 과부하 또는 기타 이유로 인해 세그먼트 오류가 발생합니다.

이 문제는 멀티 스레드를 사용하고 있다는 사실로 인해 더욱 악화됩니다. 대부분의 데이터베이스 드라이버는 멀티 스레딩이 매우 조심스럽게 처리되지 않으면 세그먼트 화 오류를 발생시키는 것으로 알려져 있습니다. 대부분의 데이터베이스 드라이버 프로토콜은 한 번에 동일한 연결을 사용하는 여러 스레드를 처리 할 수 ​​없습니다.

엄지 손가락의 규칙은 스레드 간의 단일 연결을 공유하지 않는 것입니다.

+2

그리고 나는 이것에 덧붙여 데이터베이스 연결이 스레드 자체 내에서 만들어 지도록하는 것이 중요하다고 생각한다. :) – k9b