<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Python 使用非阻塞 IO

      Python 的默認 IO 沒有非阻塞 (Non-blocking) 的功能,默認情況下,以任何方式調用 read,都可能會被阻塞。

      subprocess 中的 stdout/stderr 流

      場景描述

      假設我們現在需要通過 subprocess 調用一個子程序比如 aria2c, 然后需要實時分析它的 stdout 內容。
      那么問題就來了:

      import time
      import shlex
      import subprocess
      from subprocess import PIPE
      
      cmd = shlex.split("ria2c -x16 'http://host/file.zip'", stdout=PIPE)
      aria2c = subprocess.Popen(cmd, capture_output=True, text=True, encoding='utf-8')
      
      while aria2c.poll() is None:  # is running
          line = aria2c.stdout.readline()  # blocking
      
          # wait
          time.sleep(1)
      
      

      解決辦法

      1. 使用新線程去調用 read() 并保存到一個 buffer 中,主線程直接讀 buffer。
        • 開銷太大
      2. 使用標準庫 select 檢查是否可讀,比較優雅。
      3. 使用 fcntl 為 stdout 設置 O_NONBLOCK 標志

      socket 連接中的 io 流

      非阻塞讀取的實現:

      import time
      import socket
      from asyncio import IncompleteReadError
      
      
      class SocketStreamReader:
          def __init__(self, sock: socket.socket):
              sock.setblocking(False)  # non-blocking
              self.sock = sock
              self._recv_buffer = bytearray()
      
          def read(self, num_bytes: int = -1) -> bytes:
              raise NotImplementedError
      
          def readexactly(self, num_bytes: int) -> bytes:
              buf = bytearray(num_bytes)
              pos = 0
              while pos < num_bytes:
                  n = self._recv_into(memoryview(buf)[pos:])
                  if n == 0:
                      raise IncompleteReadError(bytes(buf[:pos]), num_bytes)
                  pos += n
              return bytes(buf)
      
          def readline(self) -> bytes:
              return self.readuntil(b"\n")
      
          def readuntil(self, separator: bytes = b"\n") -> bytes:
              if len(separator) != 1:
                  raise ValueError("Only separators of length 1 are supported.")
      
              chunk = bytearray(4096)
              start = 0
              buf = bytearray(len(self._recv_buffer))
              bytes_read = self._recv_into(memoryview(buf))
              assert bytes_read == len(buf)
      
              while True:
                  idx = buf.find(separator, start)
                  if idx != -1:
                      break
      
                  start = len(self._recv_buffer)
                  bytes_read = self._recv_into(memoryview(chunk))
                  if bytes_read == 0:
                      return None
                  buf += memoryview(chunk)[:bytes_read]
      
              result = bytes(buf[: idx + 1])
              self._recv_buffer = b"".join(
                  (memoryview(buf)[idx + 1 :], self._recv_buffer)
              )
              return result
      
          def _recv_into(self, view: memoryview) -> int:
              bytes_read = min(len(view), len(self._recv_buffer))
              view[:bytes_read] = self._recv_buffer[:bytes_read]
              self._recv_buffer = self._recv_buffer[bytes_read:]
              if bytes_read == len(view):
                  return bytes_read
              try:
                  bytes_read += self.sock.recv_into(view[bytes_read:])
              except BlockingIOError:  # socket not avaliable now
                  return 0
              return bytes_read
      
      socket_pair = "192.168.31.22", 8080
      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      sock.connect(socket_pair)
      socket_reader = SocketStreamReader(sock)
      while True:  # 問題:這里會
          line = reader.readline()
          if line is None:
              time.sleep(0.0001)
          else:
              line = line.decode()
              print(line)
      

      參考

      posted @ 2021-02-04 10:41  於清樂  閱讀(1365)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 午夜福利精品国产二区| 99在线精品国自产拍中文字幕| 天天躁久久躁日日躁| 26uuu另类亚洲欧美日本| 国产中文字幕一区二区| 男女啪啪高潮激烈免费版| 福利在线视频一区二区| 国产毛片基地| 深夜视频国产在线观看| 国产日韩一区二区三区在线观看| 人妻中文字幕一区二区三| 免费午夜无码片在线观看影院| 人妻精品动漫H无码中字| 又黄又无遮挡AAAAA毛片| 91福利国产午夜亚洲精品| 动漫av网站免费观看| 少妇真人直播免费视频| 国产又爽又黄又爽又刺激| 99精品国产综合久久久久五月天| 一本久道久久综合狠狠躁av| 国产精品天干天干综合网| 精品亚洲国产成人| 天堂va欧美ⅴa亚洲va在线| 久青草视频在线免费观看| 久久99精品久久久大学生| 成人免费A级毛片无码片2022 | 国产成人亚洲日韩欧美| 啊轻点灬大JI巴太粗太长了在线| 国产啪视频免费观看视频| 国产亚洲精品福利在线无卡一| 国产99久久精品一区二区| 国产精品一区二区三区黄| 午夜一区二区三区视频| 久久一亚色院精品全部免费 | 腾冲县| 99久久无色码中文字幕| 久久精品娱乐亚洲领先| 国自产拍偷拍精品啪啪一区二区| 精品亚洲无人区一区二区| 欧美福利电影A在线播放| 又黄又爽又色的免费网站|