2016-08-31 14 views
1

Python에서 Keyboardinterupts에 멀티 프로세서 작업과 관련된 버그가 있음을 알고 있지만 몇 가지 해결 방법이 있음을 알고 있습니다. 스레드가 cplex 패키지 내에서 처리되기 때문에 여기서 해결책을 찾을 수 없습니다. 변경할 수 없으며 변경하고 싶지도 않습니다. 이 코드를 실행하면cplex 모델을 해결 한 후 Keyboardinterupt가 작동하지 않습니다.

def test_interupt(): 
    """loops until Ctrl-C is pressed""" 
    i = 0 
    try: 
     while True: 
      i+=1 
    except KeyboardInterrupt: 
     print 'interrupted at i='+str(i) 

def solve_dummy_cplex_problem(): 
    """solves the dummy optimization problem max{x|x<42}""" 
    import cplex 
    c = cplex.Cplex() 
    c.objective.set_sense(c.objective.sense.maximize) 
    c.variables.add(names=['x'], types=[c.variables.type.continuous]) 
    c.set_problem_type(c.problem_type.LP) 
    c.linear_constraints.add(rhs=[42], senses='L', names=['cons1']) 
    c.objective.set_linear([(0,1)]) 
    c.linear_constraints.set_coefficients([(0,0,1)]) 
    c.solve() 
    print c.solution.get_values(0) 

test_interupt() 
solve_dummy_cplex_problem() 
test_interupt() 

, I는 제 1 루프를 매치를 중지 할 수 있지만, 두 번째 : 여기

는 최소 예이다. cplex가 호출 된 후 (아마도 다중 스레드 작업이 시작되었지만 두 번째로 Ctrl-C를 눌렀을 때 이미 끝났어야 함) 화면에 '^ C'가 표시되지만 두 번째 루프를 중단 할 수는 없습니다 . 내가 프롬프트에 입력 할 때 문제가 나타나지 않습니다 그러나

주, 그래서

In [1]: test_interupt() 
^Cinterrupted at i=213655938 

In [2]: solve_dummy_cplex_problem() 
Freeing MIP data. 
Tried aggregator 1 time. 
LP Presolve eliminated 1 rows and 1 columns. 
All rows and columns eliminated. 
Presolve time = 0.00 sec. (0.00 ticks) 
42.0 

In [3]: test_interupt() 
^Cinterrupted at i=35459170 

, 내가 프롬프트에서와 동일한 동작을 얻을 수 있지만, 어떻게 스크립트에서 모두 CPLEX를 호출하는과 중단 될 루프? 어떤 아이디어?

답변

0

CPLEX Python API에서 버그를 발견했을 수도 있습니다. 아직 확실하지 않지만 기본 신호 처리기가 올바르게 복원되지 않았다고 생각합니다 (CPLEX를 완료하면 손상된 것입니다).

은 특정 질문에 대한 (? 추한) 해결 방법입니다 : 실제로 큰 질문에 대답 할 수

import signal 

def test_interupt(handler): 
    """loops until Ctrl-C is pressed""" 
    signal.signal(signal.SIGINT, handler) 
    i = 0 
    try: 
     while True: 
      i+=1 
    except KeyboardInterrupt: 
     print 'interrupted at i='+str(i) 

def solve_dummy_cplex_problem(): 
    """solves the dummy optimization problem max{x|x<42}""" 
    import cplex 
    c = cplex.Cplex() 
    c.objective.set_sense(c.objective.sense.maximize) 
    c.variables.add(names=['x'], types=[c.variables.type.continuous]) 
    c.set_problem_type(c.problem_type.LP) 
    c.linear_constraints.add(rhs=[42], senses='L', names=['cons1']) 
    c.objective.set_linear([(0,1)]) 
    c.linear_constraints.set_coefficients([(0,0,1)]) 
    c.solve() 
    print c.solution.get_values(0) 

defaulthandler = signal.getsignal(signal.SIGINT) 
test_interupt(defaulthandler) 
solve_dummy_cplex_problem() 
test_interupt(defaulthandler) 

this 블로그 게시물에서 영감을받은, (멀티 프로세싱을 사용하는 경우 KeyboardInterrupt 처리하는 방법).