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()
私はこのコードを実行すると、私は最初のループではなく、第二のものをinteruptことができます。 cplexが呼び出されると(マルチスレッドジョブが開始されたが、2回目にCtrl-Cを押したときに終了しているはずです)、スクリーンに「^ C」という文字が表示されますが、 。両方のCPLEXを呼び出して、私が入力したときに、問題が表示されないことが
注意、だからプロンプト、
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
で、どのように私は、プロンプトのように、しかし、スクリプトで同じ動作を得るのですかと中断されるループ?何か案は ?