python学习——进程

1. 操作系统/应用程序

   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. 以前的你,写代码:         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()            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、网卡....         """

      4. 现在的你,写代码:         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()            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:

            t = threading.Thread(target=task,args=(url,))            t.start()

         """         - 你写好代码         - 交给解释器运行: python s2.py          - 解释器读取代码,再交给操作系统去执行,根据你的代码去选择创建多少个线程/进程去执行(单进程/4线程)。         - 操作系统调用硬件:硬盘、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

def func(arg):
    print(arg)

t = threading.Thread(target=func,args=(11,))
t.start()

print(123)
  ###################### 2.主线程默认等子线程执行完毕 #################
import threading
import time
def func(arg):
    time.sleep(arg)
    print(arg)

t1 = threading.Thread(target=func,args=(3,))
t1.start()

t2 = threading.Thread(target=func,args=(9,))
t2.start()

print(123)
  ###################### 3.主线程不再等,主线程终止则所有子线程终止 #################
import threading
import time
def func(arg):
    time.sleep(2)
    print(arg)

t1 = threading.Thread(target=func,args=(3,))
t1.setDaemon(True)#守护线程,开启优先级很低,主线程运行完之后直接关闭守护线程
t1.start()

t2 = threading.Thread(target=func,args=(9,))
t2.setDaemon(True)#守护线程
t2.start()

print(123)
  ###################### 4.开发者可以控制主线程等待子线程(最多等待时间) #################
import threading
import time
def func(arg):
    time.sleep(0.01)
    print(arg)

print(‘创建子线程t1‘)
t1 = threading.Thread(target=func,args=(3,))
t1.start()
# 无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走。
# 有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续往下走。
t1.join(2)

print(‘创建子线程t2‘)
t2 = threading.Thread(target=func,args=(9,))
t2.start()
t2.join(2) # 让主线程在这里等着,等到子线程t2执行完毕,才可以继续往下走。

print(123)
  ###################### 5.线程名称 #################
import threading
def func(arg):
    # 获取当前执行该函数的线程的对象
    t = threading.current_thread()
    # 根据当前线程对象获取当前线程名称
    name = t.getName()
    print(name,arg)

t1 = threading.Thread(target=func,args=(11,))
t1.setName(‘侯明魏‘)
t1.start()

t2 = threading.Thread(target=func,args=(22,))
t2.setName(‘刘宁钱‘)
t2.start()

print(123)
  ###################### 6.线程本质 #################  # 先打印:11?123?
import threading
def func(arg):
    print(arg)

t1 = threading.Thread(target=func,args=(11,))
t1.start()
# start 是开始运行线程吗?不是
# start 告诉cpu,我已经准备就绪,你可以调度我了。
print(123)
  ###################### 7.补充:面向对象版本的多线程 #################  # 多线程方式:1 (常见)
import threading
def func(arg):
    print(arg)

t1 = threading.Thread(target=func,args=(11,))
t1.start()
  # 多线程方式:2
import threading
class MyThread(threading.Thread):

    def run(self):
        print(11111,self._args,self._kwargs)

t1 = MyThread(args=(11,))
t1.start()

t2 = MyThread(args=(22,))
t2.start()

print(‘end‘)
  多线程   # #################### 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. 锁         - 获得          - 释放

      IO密集型:多线程      计算密集型:多进程

原文地址:https://www.cnblogs.com/bilx/p/11452922.html

时间: 2025-01-18 02:59:28

python学习——进程的相关文章

Python学习进程

1周第1天 主要是变量的学习(11月8日) 1.1 python安装(win和linux下)1.2 ipython安装及使用1.3 变量的定义1.4 变量赋值1.5 运算符(赋值.算术.关系.逻辑)1.6 表达式相关练习:1) 写一个四则运算器,要求从键盘读取数字   2) 体会input()与raw_input()区别扩展知识:十进与十六进制互相转换.十进制与字符串互相转换,int().hex().str() 1周第2天 数据类型(11月9日) 1.1 数值类型(整型.长整型.浮点型.复数型)

Python学习进程(13)文件与IO

    本节介绍基本的IO函数和文件的读写操作.     (1)读取键盘输入: Python用于读取键盘输入的函数有两个:raw_input与input. 1)raw_input函数 从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符) >>> str=raw_input("请输入一个字符串") 请输入一个字符串 >>> str=raw_input("请输入一个字符串:\n") 请输入一个字符串: my name is Me

python学习进程和线程中碰到的问题以及问题解惑

python中的os.getpid() os.getpid()是获取的是当前进程的进程号,os.getppid()是获取当前进程的父进程的进程号 python 中__name__ = '__main__' 的作用 eg: def main(): print "we are in %s"%__name__ if __name__ == '__main__': main() 这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出"we are in __main_

Python学习进程(12)模块

    模块让你能够有逻辑地组织你的Python代码段.     (1)python模块: 模块化的好处: 1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 2.模块也是Python对象,具有随机的名字属性用来绑定或引用. 3.简单地说,模块就是一个保存了Python代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块化的实例: [email protected]:/home/sunjimeng/桌面# cat first.py def ten(): for in

Python学习进程(7)字符串

    本节介绍字符串的创建与操作方法.     (1)创建字符串:     创建字符串既可以用单引号也可以用双引号: [email protected]:/home/sunjimeng/桌面# cat text.py #单引号和双引号都可以创建字符串 str1='MenAngel' str2="SunJiMeng" print(str1,' is ',str2) [email protected]:/home/sunjimeng/桌面# python3.5 text.py MenAn

Python学习进程(10)字典

    本节介绍Python中的字典:是另一种可变容器模型,且可存储任意类型对象.     (1)字典简介: 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d = {key1 : value1, key2 : value2 } 注意:键必须是唯一的,但值则不必.值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组.     (2)字典的操作: 包括创建字典.访问字典元素.修改字典的值.删除字典指定

Python学习进程(4)运算符

    本节主要介绍Python的运算符.     (1)Python语言支持的运算符类型: 1.算术运算符 2.比较(关系)运算符 3.赋值运算符 4.逻辑运算符 5.位运算符 6.成员运算符 7.身份运算符 8.运算符优先级     (2)详细介绍Python的运算符: 1)算术运算符: >>> a=20 >>> b=5 >>> c=a+b;print(c) 25 >>> c=a-b;print(c) 15 >>>

Python学习进程(6)函数

    函数最重要的目的是方便我们重复使用相同的一段程序.     (1)函数的定义: 函数定义的简单规则: 1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(): 2.任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 3.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明. 4.函数内容以冒号起始,并且缩进. 5.return [表达式] 结束函数,选择性地返回一个值给调用方.不带表达式的return相当于返回 None. 函数定义和调用的实例:

Python学习进程(11)日期和时间

    本节介绍Python应用程序处理时间和日期的方式.其中转换日期格式是最常用的功能.     (1)获取时间戳: Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 函数time.time()用于获取当前时间戳: >>> import time >>> tickets=time.time() >>> print "当前时间戳是:",tickets 当前时间戳是: 1469240559.05