2012-11-12 3 views
0

각 항목에 대해 주어진 인터벌에서 항목 목록을 통해 루프를 돌리는 응용 프로그램을 가지고있는 경우 (이는이 목록의 길이가 다양 함) 오히려 간단한 작업이지만 값을 추가하는 것이 아니라 그것은 정말로 복잡한 계산입니다.얼마 동안 잠글 지 얼마 안되는가

def method_1: 
    for item in the_list: 
     do_operation(item); 

def do_operation(item): 
    lock() 
    //do some stuff. 
    unlock() 

아니면이처럼을 수행해야합니다 :

def method_1: 
    lock() 
    for item in the_list: 
     do_operation(item); 
    unlock() 

def do_operation(item): 
    //do some stuff. 

나는이 실제로 생각

내가 궁금한 건 것은 내가이 (현재 솔루션) 등의 각 항목에 대한 고정한다입니다 정말 많이 대답하기가 힘듭니다. "그 일을하는 것"과 얼마나 걸리는지에 달려 있다고 생각하기 때문입니다. 그리고 나는 솔직히 이것이 얼마나 많은 시간이 걸리는 지 모른다. 특히 파이썬이 잠금 장치를 확보하는 데 걸리는 시간과 비교됩니다.

내 질문에 어떻게 든 개선 할 수 있다면 의견에 남겨주세요.

+1

오버 헤드가 상대적으로 높은 금액이있을 경향을 할 수 있습니다. 따라서 나는 후자의 선택에 대해 논쟁하는 경향이있다. 특히 임계 영역의 일부가 아닌 루프의 실질적인 부분이없는 경우와 같이 특히 그렇습니다. 다른 한편,'do_operation'이 다른 곳에서 사용되고, 항상 보호되어야한다면, 함수 내에서 잠금을 수행하는 것이 합리적입니다. – jpm

+0

스레딩을 사용하지 않는다면 필요 없습니다. 당신의 코드에 당신이 그것을 사용해야한다고 제안하는 것을 주목하고 있습니다. –

+0

많은 잠금이 컨텍스트 관리자 프로토콜을 지원합니다 ('with lock : do stuff'). 이것은 예외 (대체 :'try :'/'finally :'절)의 경우 유용합니다. – glglgl

답변

0

전체 목록을 잠글 것을 제안합니다 (옵션 2). 각 항목에 대해서만 잠글 경우 작업이 진행되는 도중에 목록이 수정 될 수 있으며 이는 정확히 무엇을하고 있는지에 따라 문제가 될 수 있습니다. 각 잠금 및 잠금 해제와 관련된 오버 헤드도 있습니다.

+0

목록 변경에 대한 좋은 지적. –

+0

목록 자체, 주로 길이 또는 순서를 변경하는 경우 또는 요소를 변경하는 경우에 따라 다릅니다. 목록을 조작하려면 Queue-module을 조사해야합니다. 더 자주 그런 다음 목록/대기열의 구성원을 조작 할 여러 스레드를 원하는 것은 아닙니다. 왜냐하면 이것이 동시성에서 기본적인 생산자/소비 패러다임이기 때문입니다. –

1

일반적으로 잠금 시간 슬라이스를 가능한 짧게 유지하려고합니다. 그래서 당신은 normaly 변수 접근 바로 직전에 잠그고 즉시 다시 드롭합니다. 동시성의 주요 원인을 덜어주기 때문에 완전한 루프를 차단하고 싶지는 않습니다.

목록의 경우 : 특히 스레드 실행을위한 다른 Queue-classes을 살펴 보았습니까?

jpm의 의견은 바로 자리를 비 웠습니다. 다른 스레드가 일부 작업을 수행하는 경우에도 해당 스레드를 보호해야합니다. 스레드 굶주림 문제가있을 수도 있습니다.

0

잠금 목록 (그리고 상품 자체)를 보호하기 위해 단지의 경우 당신은 또한

def method_1: 
    lock() 
    list = the_list[:] 
    unlock() 
    for item in list: 
     do_operation(item); 
관련 문제