zoukankan      html  css  js  c++  java
  • py 的 第 32 天

    首先区分了一下操作系统和应用程序

       a. 硬件
        - 硬盘
        - CPU
        - 主板
        - 显卡
        - 内存
        - 电源
        ...
      b. 装系统(软件)
        - 系统就是一个由程序员写出来软件,该软件用于控制计算机的硬件,让他们之间进行相互配合。

      c. 安软件(安装应用程序)
        - QQ
        - 百度云
        - pycharm

    2. 并发和并行
        并发,伪,由于执行速度特别快,人感觉不到停顿。
        并行,真,创建10个人同时操作。

    3. 线程、进程
      a. 单进程、单线程的应用程序

        print('666')

      b. 到底什么是线程?什么是进程?
        Python自己没有这玩意,Python中调用的操作系统的线程和进程。

      c. 单进程、多线程的应用程序
        代码:
        import threading
        print('666')

        def func(arg):
        print(arg)
        t = threading.Thread(target=func)
        t.start()

        print('end')

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

    d. 故事: Alex甄嬛西游传

    总结:

      1. 操作系统帮助开发者操作硬件。
      2. 程序员写好代码在操作系统上运行(依赖解释器)。
      3.python由于有GIL锁,所以只能单线程操作
        

       Python多线程情况下:
        - 计算密集型操作:效率低。(GIL锁)
        - IO操作: 效率高

       Python多进程的情况下:
        - 计算密集型操作:效率高(浪费资源)。 不得已而为之。
        - IO操作: 效率高 (浪费资源)。

      以后写Python时:
        IO密集型用多线程: 文件/输入输出/socket网络通信
        计算密集型用多进程。

    扩展:
      Java多线程情况下:
        - 计算密集型操作:效率高。
        - IO操作: 效率高
      Python多进程的情况下:
        - 计算密集型操作:效率高(浪费资源)。
        - IO操作: 效率高 浪费资源)。

      4.Python中线程和进程(GIL锁)

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

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

      5.pyhon线程编写

    import threading
    
    		# #################### 1. 计算密集型多线程无用 ####################
    		# 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 *****

                  # True  主线程执行完不管子线程是否执行完,程序终止
                         # False   主线程执行完 ,等待子线程执行完, 程序终止


        - setName *****  设置线程名
        - threading.current_thread() *****
    d. 锁
        - 获得
        - 释放

    # threading.currentThread(): 返回当前的线程变量。或  获取当前执行该函数的线程对象
      # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
      # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
  • 相关阅读:
    中国大学MOOC-数据结构基础习题集、07-2、Insert or Merge
    NSDate相关
    切换中文键盘时覆盖输入框的完美解决方案
    自定义UITableView的右侧索引
    调用系统的短信和发送邮件功能,实现短信分享邮件分享
    程序出现警告,解决方式
    键盘隐藏问题
    java修饰符
    java覆盖和隐藏
    java嵌套类
  • 原文地址:https://www.cnblogs.com/Mrszhao/p/9628267.html
Copyright © 2011-2022 走看看