zoukankan      html  css  js  c++  java
  • python 并发 中线程和进程相关

    1.操作系统/应用程序

      a : 硬盘 , CPU , 主板 , 显卡 , 内存 , 电源 ...

      b.装系统 (软件)

        系统就是一个由程序员写出来的软件 , 该软件用于控制计算机的硬件 , 让他们之间相互进行配合。

      c.安软件 (安装应用程序)

        QQ

        百度云

        pycharm

        ....

    2.操作中的"并发"   ('并行')

        并发 , 伪 , 由于执行速度特别快 , 人感觉不到停顿。

        并行 , 真 , 创建10个人同时操作。

    3.其他语言线程 , 进程

      a. 单进程 , 单线程的应用程序

          print('666')

      b.到底什么是线程 ? 什么是进程 ? 

          python自己没有这个点西   ,  python中调用的操作系统的线程和进程

      c.单进程 , 多进程的应用程序

        代码: 

    import threadin
    print('666')
    
    def func(arg):
    print(arg)
    t = threading.Thread(target=func)
    t.start()
    
    print('end')

    一个应用程序 (软件)  ,  可以有多个进程 (默认只有一个) , 一个进程中可以创建多个线程(默认一个) 。

      d.故事 : 大神与甄嬛传西游记的故事

      故事总结:

          1.操作系统帮助开发者操作硬件。

          2.程序员写好代码在操作系统上运行(依赖解释器)

          3.以前写代码:

    import threading
    import requests
    import uuid
    
    url_list = [
             'https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg',
             'https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg',
             'https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg',
            ]
    def task(url):
        """"""
        
        """

      1.DNS解析 , 根据域名解析出IP

      2.创建socket客户端   sk = socket.socket.socket()

      3.向服务端发起连接请求 sk.connect()

      4.发送数据 (我要照片)    sk.send(...)

      5.接受数据       sk.recv(8096)

      接受到数据后写入文件。

    示例 :  

    ret = requests.get(url)
    file_name = str(uuid.uuid4()) + '.jpg'
    with open(file_name, mode='wb') as f:
    f.write(ret.content)
    
    for url in url_list:
        task()

    你写好代码

    交给解释器运行 :  python  s1.py

    解释器读取代码, 再交给操作系统去执行, 根据你的代码去选择创建多少个线程/进程去执行(单进程/单线程)

    4.现在的你,写代码:

    import threading
    import 
    import uuid
    
    url_list
    = [ 'https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg', 'https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg', 'https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg', ] def task(url):

    1.DNS解析, 根据域名解析出IP

    2.创建socket客户端         sk = socket.socket()

    3.向服务端发起连接请求  sk = connect()

    4.发送数据(我要照片)       sk = send (....)

    5.接受数据                        sk.recv(8096)

    接受数据写入文件。

    ret = requests.get(url)
    file_name = str(uuid.uuid4()) + '.jpg'
    with open(file_name, mode='wb') as f:
    f.write(ret.content)
    
    for url in url_list:
        task()
    你写好代码
    交给解释器运行: python s1.py
    释器读取代码,再交给操作系统去执行,根据你的代码去选择创建多少个线程/进程去执行(单进程/单线程)。
    操作系统调用硬件:硬盘、cpu、网卡....
    python 多线程情况下:
      计算密集型操作:效率低 (GIL锁)
      IO操作:效率高
    python多进程情况下:
      计算密集型操作:效率高(浪费资源)
      IO操作:效率高(浪费资源)
    以后写python时:
      IO密集型用多线程 : 文件/输入输出/socket网络通信
    扩展:
    Java多线程情况下:
    计算密集型操作:效率高。
    IO操作: 效率高
    Python多进程的情况下:
    计算密集型操作:效率高(浪费资源)。
    IO操作: 效率高 浪费资源)。

    4. Python中线程和进程(GIL锁)
    GIL锁,全局解释器锁。用于限制一个进程中同一时刻只有一个线程被cpu调度。

    扩展:默认GIL锁在执行100个cpu指令(过期时间)。

    5.python线程编写
    # 1. 计算密集型多线程无用 
    import threading
    v1 = [11,22,33] # +1
    v2 = [44,55,66] # 100
    
    
    def func(data,plus):
        for i in range(len(data)):
            data[i] = data[i] + plus
    
    t1 = threading.Thread(target=func,args=(v1,1))
    t1.start()
    
    t2 = threading.Thread(target=func,args=(v2,100))
    t2.start()
    # 2. IO操作 多线程有用 
    import threading
    import requests
    import uuid
    
    url_list = [
        'https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg',
        'https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg',
        'https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg',
    ]
    
    def task(url):
        ret = requests.get(url)
        file_name = str(uuid.uuid4()) + '.jpg'
        with open(file_name, mode='wb') as f:
            f.write(ret.content)
    
    for url in url_list:
    
        t = threading.Thread(target=task,args=(url,))
        t.start()

    1.应用程序/进程/线程  基础了解

    2.为什么创建线程

    由于线程是cpu工作的最小单元,创建线程可以利用多核优势实现并行操作(Java/C#)。

    注意:线程是为了工作。

    3.为什么创建进程

    进程和进程之间做数据隔离(Java/c#)

    注意 : 进程是为了提供环境让线程工作

    4. Python

    a. Python中存在一个GIL锁。

      造成:多线程无法利用多核优势。

      解决:开多进程处理(浪费资源

    总结:

      IO密集型:多线程 

      计算密集型:多进程

    b. 线程的创建

      Thread

      MyThread 

    c. 其他

      join

      setDeanon

      setName 

      threading.current_thread()

    d. 锁

      获得 

      释放

    继续完善           

              

    4.python中的线程和进程  (GIL锁)

    5.python 线程编写 + 锁

  • 相关阅读:
    Oracle索引
    Oracle Union Union All 对查询结果集操作
    Oracle表连接
    BIOS + MBR > UEFI + GPT
    Opensource Licenses
    Linux 系统下使用dd命令备份还原MBR主引导记录
    Linux 文件类型笔记
    Linux 分支那么多,这里可以帮你缩小选择范围
    Arch Linux 的休眠设置
    Arch Linux pacman 与其他发行版操作比较
  • 原文地址:https://www.cnblogs.com/SUIFAN/p/9623235.html
Copyright © 2011-2022 走看看