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를 호출하는과 중단 될 루프? 어떤 아이디어?