2017-10-27 36 views
-1

, 다음과 같이 데이터가 이용 가능한 채널 차단 스레드, 파이썬비 - 프로그래밍 모델을 비 차단 IO 프로그래밍 모델에서

, 자바

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 프로그래밍 모델은 또 다른 CPU 바인딩 작업을 수행하는 무한 루프없이 함께/NIO 을 수행 할 스레드를 수 있습니까 그 동안 동일한 스레드에서?

+0

예. 그러나 정말로 좋은 생각은 아닙니다. 이러한 작업에 전용 스레드가 있어야합니다. –

+0

@ xiaofeng.li 예, 당신은 nio를 수행 할 수있는 동일한 스레드를 의미하며 다른 작업의 CPU 바인딩 작업을 수행 할 수 있습니까? 몇 가지 코드를 공유 할 수 있습니까? 이러한 작업에 전용 스레드가 있다는 것을 알고 있습니다. – overexchange

+0

'비 차단 IO 프로그래밍 모델에서 한 채널에서 차단 된 스레드'는 이미 모순이 있습니다. – EJP

답변

1

이러한 API를 사용하면 일반적으로 선택 단계에 시간 초과를 지정할 수 있습니다. 즉, 채널이 준비 될 때까지 대기하는 시간이며, 타임 아웃에서 준비가 된 채널이없는 경우 빈 세트를 반환합니다. 또한 즉시 반환하는 비 블록 선택을 수행 할 수 있습니다. 파이썬에서

:

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 

자바의 Selector 클래스는 selectNow() 및 사용할 수있는 select(long timeout) 같은 유사한 방법이있다.

0

나는 같은 스레드에서 동시에 다른 작업을 수행하는 것이 쉽지 않다고 생각합니다. 다른 작업을 실행하려면 코드를 호출해야합니다. 합리적인 기간 내에 통제가 입력을 점검하도록하는 방법은 무엇입니까?

그러나 다른 작업을 처리하는 별도의 스레드가있는 경우 런타임 시스템은 사용 가능한 리소스가있을 때마다 실행되도록 해당 스레드를 할당합니다. 바쁜 루프에서 Thread.sleep (100)과 같은 것을 사용한다면이 바쁜 루프가 너무 많은 자원을 사용하지 않아서 특별한 일을하지 않아도 다른 것들을 동시에 실행할 수 있습니다. .

그러나 입력 검사기 스레드와 다른 스레드간에 공유되는 모든 리소스가 스레드 안전 모드로 처리되어야합니다.