• python网络编程 day34 网络编程——线程的相关概念及开启线程


    一、内容回顾

    • 开启进程的另一种方式

      • 面向对象

        from multiprocessing import Process
        class MyProcess(Process):
           def __init__(self,参数):
               self.属性 = 参数
               super().__init__()
           def run(self):
               print('子进程代码')
               
        if __name__ == '__main__':
           p = MyProcess(参数)
           p.start()

         

    • 守护进程:会等待主进程代码结束后,立即结束

      • p.daemon =True

      • 一般情况下,多个进程的执行顺序可能是

      • 主进程代码结束——》守护进程代码结束——》子进程代码结束——》主进程代码结束

      • 保证数据的安全

      • 会降低效率

      • 互斥锁

      • 列子:抢票、购买车票

      lock = lock()
      lock.acquire()
      ......
      lock.release()

      或者
      with lock:
      .................
         
         
      import json
      from multiprocessing import Process,Lock
      def search(i):
         with open('buy_ticket.txt',encoding='utf-8',mode='r') as f:
             dic = json.load(f)
             print(f'{i}剩余票数为:{dic["count"]}')
             return dic
      def buy_ticket(dic,i):
         if dic['count'] > 0:
             with open('buy_ticket.txt',encoding='utf-8',mode='w') as f:
                 dic['count'] -= 1
                 json.dump(dic,f)
                 print(f'{i} 购票成功')
      def get_ticket(i,lock):
         dic = search(i)
         with lock:
             buy_ticket(dic,i)
      if __name__ == '__main__':
         lock = Lock()
         p_l = []
         for i in range(10):
             p = Process(target=get_ticket,args=(i,lock))
             # p1 = Process(target=buy_ticket, args=(i,))
             p.start()
             p_l.append(p)
             # p1.start()
         # for p in p_l:
         #     p.join()

       

    • 队列 IPC 进程之间的通信 ——数据安全

      • 基于socket实现的,也是基于picke,还是基于lock实现的

      • PIpe 管道,基于socket实现的,也是基于picke,——数据不安全

    • 生产者消费者模型

      • 把原本获取数据处理数据的完整过程进行了解耦

      • 把生产数据和消费数据分开,根据生产和消费的效率不同,来让程序的执行效率达到平衡

    • 同步阻塞

      • 调用一个函数必须等待结果,cpu不工作,input sleep recv recvfrom accept get

    • 同步非阻塞

      • 调用一个函数必须等待结果,cpu工作——》调用一个高计算的函数 strip eval('1+2-3+4')

    • 异步阻塞

      • 调用函数不需要立即获取结果,而是继续做其他的事情,再获取结果的时候不知道先获取谁的结果,但是总是需要等待结果,

    • 异步非阻塞

      • 调用函数不需要立即获取结果,也不需要等 start terminate(结束)

     

    二、今日内容

    1、进程内容

    • 进程之间数据隔离,资源分配的最小单位,可以利用多核,操作系统调度

      • multiprocessing如何开启进程 start join

      • 进程也有数据不安全问题 lock可以解决

      • 进程之间可以通信IPC

        • 队列 安全

        • 管道 不安全

        • 第三方工具

          • kafka

          • redis

      • 进程之间可以通过Manage类实现数据共享

      • 生产者消费者模型

    2、生产者消费者模型

     

     

    3、线程的概念

    • 能被操作系统调度给cpu执行的最小单位

    • 可以利用多核的

    • 线程之间的数据共享,也是操作系统调用的

    • 数据不安全

    • 全局解释器锁 GIL

      • 导致了,同一个进程中多个线程只能有一个线程被CPU执行

      • 节省的是IO操作的时间,而不是cpu计算的时间

    • 线程没有terminate方法,不能关闭,只能等待他执行完成

    • 数据共享的

    4、threading模块开启线程

    • 开启线程

    from threading import Thread,current_thread,enumerate,active_count
    import os
    import time
    def func(i):
       print(f'start{i}')
       print(current_thread().ident)  #获取线程ID
       time.sleep(1)
       print(f'end{i}')

    t_lst = []
    for i in range(10):
       t = Thread(target=func,args=(i,))
       t.start()
       t_lst.append(t)
       print(t.ident,os.getpid())
    print('111')
    print('线程的对象列表:%s'%enumerate())
    print('线程的对象列表数量:%s'%active_count())
    for t in t_lst:
       t.join() #所有线程执行完后,才执行下面的代码
    print('开启了')

     

    • 面向对象开启线程

    from threading import Thread
    class MyThread(Thread):
       def __init__(self,a,b):
           self.a = a
           self.b = b
           super().__init__()
       def run(self):
           print(self.ident)

    t = MyThread(1,2)
    t.start()

     

  • 相关阅读:
    微软发布了Java Lang Conversion Asst 3.0测试版
    关于GC的使用
    增加了简单的搜索功能
    [推荐]TreeView专题讨论
    我是这样过大年初一的!
    [推荐]动态加载类(在程序中调用DLL文件)
    请大家正确填写自己的邮件地址
    Microsoft Win32 to Microsoft .NET Framework API Map
    奇怪的问题
    发表含有HTML代码的文章时,请保持HTML代码的完整
  • 原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14320116.html
Copyright © 2020-2023  润新知