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

   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())有相同的结果。