2016-08-31 3 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() 

私はこのコードを実行すると、私は最初のループではなく、第二のものを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 

で、どのように私は、プロンプトのように、しかし、スクリプトで同じ動作を得るのですかと中断されるループ?何か案は ?

答えて

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の対処方法)。

関連する問題