2017-10-27 12 views
-1

、以下に示すように、データの利用可能なチャネル上でブロックされたスレッド、Pythonで非 - プログラミング・モデルを非ブロッキングIOプログラミングモデルにおいて

、Javaで

while True: 
    readers, _, _ = select.select([sys.stdin, sock], [], []) # blocked select() 
    for reader in readers: 
     if reader is sock: 
      print(sock.recv(1000).decode('utf-8')) 
     else: 
      msg = sys.stdin.readline() 
      sock.send(msg.encode('utf-8')) 

 public void run() { 
     while(true){ 
      try{ 
       executeCycle(); 
      } catch(IOException e){ 
       e.printStackTrace(); 
      } 

      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


    public void executeCycle() throws IOException { 
     takeNewSockets(); 
     readFromSockets(); 
     writeToSockets(); 
    } 

ノンブロッキングIOプログラミングモデルでは、実行フローは通常、メイン(唯一の)利用可能なチャネル(準備完了)を見つけ、使用可能なチャネルでIOを実行する責任があります。すべてのチャネルが(持続時間)ビジーであるシナリオでは、


、非ブロッキングIOプログラミングモデルはまた、無限ループずに/とNIO を実行するスレッドが別のCPUバウンドのタスクを実行することができませんその間、同じスレッドで?

+0

はい。しかし、実際には良い考えではありません。これらの操作には専用スレッドが必要です。 –

+0

@ xiaofeng.liはい、nioを実行できる同じスレッドを意味し、他のタスクのCPUバインド操作も実行できますか?いくつかのコードを共有できますか?これらの操作に専用のスレッドを持たせることは理解されています – overexchange

+0

'非ブロック化IOプログラミングモデルでは、1つのチャネルでブロックされたスレッド'はすでに矛盾しています。 – EJP

答えて

1

これらのAPIを使用すると、通常、選択ステップのタイムアウトを指定できます。つまり、いずれかのチャネルの準備が完了するのを待つ時間です。タイムアウトでチャネルが準備できなくなった場合は、空のセットが返されます。すぐに戻る非ブロック選択を行うこともできます。 Pythonで

while True: 
    readers, _, _ = select.select([sys.stdin, sock], [], [], 0) # non-block select 
    # readers could be an empty list 
    if readers: 
     for reader in readers: 
      if reader is sock: 
       print(sock.recv(1000).decode('utf-8')) 
      else: 
       msg = sys.stdin.readline() 
       sock.send(msg.encode('utf-8')) 
    else: 
     some_other_operations() # but only when no channel is ready 

JavaのSelectorクラスを使用すると、使用することができますselectNow()select(long timeout)のような同様の方法があります。

0

他の操作を同じスレッドで同時に行うのは簡単ではないと思います。これらの他の操作を実行するコードを呼び出す必要があります。あなたは、コントロールが合理的な時間枠で入力のチェックに戻ることをどのように保証しますか?

しかし、他の操作を処理する別のスレッドがある場合、ランタイムシステムは利用可能なリソースがあるときはいつでも、それらのスレッドを実行するように割り当てます。ビジー・ループでThread.sleep(100)のようなものを使用している場合は、このビジー・ループが非常に多くのリソースを消費しないようにして、特別なことをすることなく他のものを同時に実行できるようにします。

入力チェッカースレッドと他のスレッドとの間で共有されるリソースは、スレッドセーフな方法で処理する必要があります。

関連する問題