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()

 

原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14320116.html