• python常见问题


    Python

    • python 没有多态,而是鸭子类型
    • 多继承,没有接口,可通过语法糖实现接口的作用
    • lambda中只能有一句
    • "/"表示之前的参数是必须是位置参数,”**“表示是后面的必须是关键字参数

    Python多进程

    image-20211228120459335

    Python 多线程是伪多线程

    • 多线程子线程会随着主线程结束而中断,因此一般在主线程中调用thread.join()

    • 线程方法

      • import threading
        t = thread.Thread()
        t.start();
        # 没有返回值,若需要返回值可继承该类,在类中保存计算结果,用以获取
        # 或者传入全局结果参数,
        
      • import thread # threading 封装了thread
        
      • import threadpool # 三方库
        
      # 线程池
      import asyncio
      async def coro(i):
          print("core start",i)
          ret = await get(i) # 此处为耗时的io等操作
          print("core end",i)
          return ret
      async def get(i):
          await asyncio.sleep(5)
          return i
      loop = asyncio.get_event_loop()
      a = [asyncio.ensure_future(coro(i)) for i in range(10)]
      loop.run_until_complete(asyncio.wait(a))
      loop.close()
      print([i.result() for i in a])
      
      import concurrent.futures
      with concurrent.futures.ThreadPoolExecutor() as pool:
          results = pool.map(function,args)   # 注意此处是任务提一提交完,args为参数列表的列表
          # result 线程的结果
          # 或者
          future = pool.submit(function,args)  # 每次提交一个
          future.result() # 结果
      
          for futures in futures: # 顺序执行
              xxxx
          for futures in concurrent.futures.as_completed(futures): # 不会按照顺序执行,那个线程先结束先执行那个
              xxxx
      

    Python协程

    • 单线程的IO多路复用,使用了单线程中IO阻塞的那一段时间,但其实还是顺序执行,按照IO阻塞切换,因此不会出现协程安全问题
      • 可以说是异步操作
    • 开销小,切换容易

    image-20211228124409752

    GIL锁:全局解释器锁,Cython

    • cpu计算时线程需要获取GIL锁,只有一个,因此多核cpu也只有一个线程可以执行,主要防止多线程垃圾回收不安全

      • GIL只保证有一个线程运行,但不保证线程何时切换,因此还有线程安全问题。

      • 程序代码现线程安全问题还是要加LOCK

        • import threading
          lock = threading.Lock()
          lock.acquire()
          lock.release()
          # 或者
          with lock:
              xxxx 
          
    • 执行IO操作时会释放锁,因此对于IO密集型任务,可以用多线程,计算密集型,不能发挥多核,多线程作用。

    • 引用计数法+循环检测:GC

    面向对象

    • 类中的变量是静态变量,方法通过@staticmethod修饰,是静态,self.xxx=yy 实例变量

    WWW

    import urllib.request
    if __name__ == '__main__':
        data = urllib.parse.urlencode({'wd':'python'}).encode("utf8")
        request = urllib.request.urlopen("http://baidu.com",data=data)
        with request:
            msg,hd = request.read(),request.info()
            print(msg)
            print(hd)
    

    SMTP

    # smtplib email 配合使用
    # 或是unix系统中的sendmail命令
    

    SOCKET

    • # 旧版本异步通信
      import asyncore
      class HTTPClient(asyncore.dispatcher):
          def __init__(self,host):
              #  初始化父类
              asyncore.dispatcher.__init__(self)
              # 创建一个socket对象
              self.create_socket()
              # 连接服务器端
              self.connect((host,80))
          #发送优化
              self.buffer = b'GET /HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n'
          def handle_connect(self):
              print('服务器连接成功')
          def handle_close(self):
              print('服务器连接断开')
              self.close()
          def readable(self):
              return True
          def handle_read(self):
              # 指定一次读取1024个字节,如果一次没有读完的话,那么事件循环会分多次把内容读完为止
              print(self.recv(1024).decode())
          def writable(self):
              return (len(self.buffer)>0)
          def handle_write(self):
              sent = self.send(self.buffer)
              self.buffer = self.buffer[sent:]
      if __name__ == '__main__':
          HTTPClient('www.baidu.com')
          asyncore.loop()
       import asyncore
      import socket
      
      class EchoHandler(asyncore.dispatcher_with_send):
          def handle_read(self):
              data = self.recv(8192)
              if data:
                  self.send("hello".encode('utf8')+data)
      class EchoServer(asyncore.dispatcher):
          def __init__(self, host, port):
              asyncore.dispatcher.__init__(self)
              self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
              self.set_reuse_addr()
              self.bind((host, port))
              self.listen(5)
          def handle_accept(self):
              pair = self.accept()
              if pair is not None:
                  sock, addr = pair
                  print('Incoming connection from %s' % repr(addr))
                  handler = EchoHandler(sock)
      if __name__ == '__main__':
          server = EchoServer('10.101.33.82', 8080)
          asyncore.loop()
      
    • import asyncio
      async def handle_echo(reader, writer):
          while True:
              data = await reader.read(100)
              message = data.decode("gbk")
              addr = writer.get_extra_info('peername')
              print(f"Received {message!r} from {addr!r}")
              if message == '-1':
                  writer.write("将会结束!".encode("gbk"))
              else:
                  writer.write(message.encode("gbk"))
              await writer.drain()
      
              if message == '-1':
                  writer.close()
                  break
      async def main():
          server = await asyncio.start_server(
              handle_echo, '10.101.33.82', 8080)
      
          addr = server.sockets[0].getsockname()
          print(f'Serving on {addr}')
      
          async with server:
              await server.serve_forever()
      
      asyncio.run(main())
      

    编码

    # 编码,utf8
    #3字节 1110xxxx 10xxxxxx 10xxxxxx   中文:"中"
    # utf8--> 4e2d -》0100 1110 0010 1101
    b'\xe4\xb8\xad'.decode('utf8') # “中“
    # 与上边组 1110 0100 10111000 10101101 -》就是 e4b8ad
    

    b'xxxxx' xxxx 应该是字节数,例如ascii中的,或者是用16进制表示的汉字

    b'a' == b'\x61'

    b'\e4\xb8\xad' 按照utf8解码后就是‘中’

    图形界面

    Python3 Tkinter Qt

    wxwidgets,Kivy,Fltk

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可评论咨询.
  • 相关阅读:
    PHP实现http与https转化
    HTTP和HTTPS详解
    如何防止SWF文件被反编译
    Swf Decrypt详解
    PCIE体系结构
    windows设备驱动安装指南
    [转]RegOpenKeyEx函数失败的问题
    用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]
    Skipped Rebuild All: Project with VS2008
    LINK : fatal error LNK1000: Internal error during IncrBuildImage
  • 原文地址:https://www.cnblogs.com/Dean0731/p/15730771.html
Copyright © 2020-2023  润新知