python 线程
一.操作系统/应用程序
1.什么是操作系统:
操作系统就是程序员写出来的软件,该软件用来控制计算机硬件,让他们之间相互配合,完成相应的操作.
2.什么是应用程序?
应用程序是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序.
二.并发于运行
并发: 伪,由于执行速度特别快,人感觉不到停顿.
并行:真,创建10个人同时操作
三.线程和进程
a.单线程.单进程的应用程序
print(666)
b.什么是线程,什么是进程?
python自己没有线程和进程,python中调用的操作系统的线程和进程.
总的来说线程就可以当做是进程里面的执行的单元,同时它也是这个进程里面的一个能够调度的实体。首先来说进程和线程两个全是基本单元,完全是为了操作系统运行程序而存在的。该类系统为了要实现应用程序的并发性处理,就必须要运用该基本单元。因此它们之间有相似处也有区别。线程和进程的区别可以表现为以下的几个因素:
1、首先是定义
进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。
2、一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
3、线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。
4、线程没有地址空间,线程包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程 的文本片段中,进程拥有的所有资源都属于线程。所有的线程共享进程的内存和资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。
5、父和子进程使用进程间通信机制,同一进程的线程通过读取和写入数据到进程变量来通信。
6、进程内的任何线程都被看做是同位体,且处于相同的级别。不管是哪个线程创建了哪一个线程,进程内的任何线程都可以销毁、挂起、恢复和更改其它线程的优先权。线程也要对进程施加控制,进程中任何线程都可以通过销毁主线程来销毁进程,销毁主线程将导致该进程的销毁,对主线程的修改可能影响所有的线程。
7、子进程不对任何其他子进程施加控制,进程的线程可以对同一进程的其它线程施加控制。子进程不能对父进程施加控制,进程中所有线程都可以对主线程施加控制。
相同点:
进程和线程都有ID/寄存器组、状态和优先权、信息块,创建后都可更改自己的属性,都可与父进程共享资源、都不鞥直接访问其他无关进程或线程的资源。
c.单进程.多线程的应用程序
import threading print('666') def func(arg): print(arg) t = threading.Thread(target=func) t.start() print('end')
一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认一个)
总结:
Python多线程情况下: - 计算密集型操作:效率低。(GIL锁)
- IO操作: 效率高
Python多进程的情况下: - 计算密集型操作:效率高(浪费资源)。 不得已而为之。
- IO操作: 效率高 (浪费资源)。
以后写Python时:
IO密集型用多线程:
文件/输入输出/socket网络通信 计算密集型用多进程。
扩展:
Java多线程情况下:
- 计算密集型操作:效率高。
- IO操作: 效率高 Python多进程的情况下:
- 计算密集型操作:效率高(浪费资源)。
- IO操作: 效率高 浪费资源)。
四.线程编写
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()
五.python中线程和进程(GIL锁)
GIL锁,全局解释器锁.用于限制一个进程中同一时刻只有一个线程被cpu调度
扩展:默认GIL锁在执行100个cpu指令(过期时间)