python中线程和进程相关
Posted 帆总、欧巴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中线程和进程相关相关的知识,希望对你有一定的参考价值。
1.操作系统/应用程序
a : 硬盘 , CPU , 主板 , 显卡 , 内存 , 电源 ...
b.装系统 (软件)
系统就是一个由程序员写出来的软件 , 该软件用于控制计算机的硬件 , 让他们之间相互进行配合。
c.安软件 (安装应用程序)
百度云
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 线程编写 + 锁
以上是关于python中线程和进程相关的主要内容,如果未能解决你的问题,请参考以下文章