https://www.zhihu.com/question/27991975
java nio的io模型是同步非阻塞,這里的同步異步指的是真正io操作(數據內核態用戶態的拷貝)是否需要進程參與。
而說java nio提供了異步處理,這個異步應該是指編程模型上的異步。基於reactor模式的事件驅動,事件處理器的注冊和處理器的執行是異步的。
JAVA NIO是同步非阻塞io。同步和異步說的是消息的通知機制,阻塞非阻塞說的是線程的狀態 。
下面說說我的理解,client和服務器建立了socket連接:
1、同步阻塞io(Blocking, synchronous):client在調用read()方法時,stream里沒有數據可讀,線程停止向下執行,直至stream有數據。
下面說說我的理解,client和服務器建立了socket連接:
1、同步阻塞io(Blocking, synchronous):client在調用read()方法時,stream里沒有數據可讀,線程停止向下執行,直至stream有數據。
阻塞:體現在這個線程不能干別的了,只能在這里等着
同步:是體現在消息通知機制上的,即stream有沒有數據是需要我自己來判斷的。
device = IO.open() data = device.read() # thread will be blocked until there is no data in the device print(data)
2、同步非阻塞io(Non-blocking, synchronous):調用read方法后,如果stream沒有數據,方法就返回,然后這個線程就就干別的去了。
非阻塞:體現在,這個線程可以去干別的,不需要一直在這等着
同步:體現在消息通知機制,這個線程仍然要定時的讀取stream,判斷數據有沒有准備好,client采用循環的方式去讀取,可以看出CPU大部分被浪費了
device = IO.open() while True: is_ready = IO.poll(device, IO.INPUT, 5) # returns control if 5 seconds have elapsed or there is data to read (INPUT) if is_ready: data = device.read() break # exit loop else: print("There is no data to read!")
3、異步非阻塞io(Non-blocking, asynchronous):服務端調用read()方法,若stream中無數據則返回,程序繼續向下執行。當stream中有數據時,操作系統會負責把數據拷貝到用戶空間,然后通知這個線程,這里的消息通知機制就是異步!而不是像NIO那樣,自己起一個線程去監控stream里面有沒有數據!
ios = IO.IOService() device = IO.open(ios) def inputHandler(data, err): "Input data handler" if not err: print(data) device.readSome(inputHandler) ios.loop() # wait till all operations have been completed and call all appropriate handlers