python中线程和进程相关

Posted 帆总、欧巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 线程编写 + 锁

以上是关于python中线程和进程相关的主要内容,如果未能解决你的问题,请参考以下文章

[Python3] 043 多线程 简介

GIL 相关 和进程池

python中线程和进程相关

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

线程学习知识点总结

什么是多线程,多进程?