• Python_线程、线程效率测试、数据隔离测试、主线程和子线程


    0、进程中的概念

      三状态:就绪、运行、阻塞

        就绪(Ready):当进程已分配到除CPU以外的所有必要资源,只要获得处理机便可立即执行,这时的进程状态成为就绪状态.

        执行/运行(Running)状态:当进程已获得处理机,其程序正在处理机上执行,此时的进程状态成为执行状态.

        阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态.引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等.

      同步:一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

      异步:不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖他的任务无法确定,所以是不可靠的任务序列。

        

       进程是计算机中最小的资源分配单位。

      基础的进行开启:    

     1 import time
     2 from multiprocessing import Process
     3 
     4 def f(name):
     5     print('hello', name)
     6     print('我是子进程')
     7 
     8 if __name__ == '__main__':
     9     p = Process(target=f, args=('bob',))
    10     p.start()
    11     time.sleep(1)
    12     print('执行主进程了')
    子进程的开启
    1 D:Python36python.exe E:/Python/草稿纸.py
    2 hello bob
    3 我是子进程
    4 执行主进程了
    5 
    6 Process finished with exit code 0
    结果

      锁 —— 互斥锁

      信号量 —— 锁 + 计数器

      事件 —— Python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法set、wait、clear。

        事件处理的机制:全局定义了一个‘Flag’,如果‘Flag’值为False,那么当程序event.wait方法时就会阻塞,如果'Flag'值为True,那么event,wait方法便不再阻塞.

        clear:将'Flag'设置为False.

        set:将'Flag'设置为True.

      数据共享  Manager : dict、list

        进程都在同一台计算机上才能用。

        数据在进程之间不安全。

      进程之间的数据共享 : 消息中间

        memcache

        rabbitmq

        redis

      队列:管道 + 锁

        处理任意数据类型

        进程之间的数据安全 —— 进程安全

      管道:

        有两端

        需要关闭不用的所有端口,才会在recv处报错。

        进程不安全。

      进程池:

        什么情况下要用进程池:

          高CPU型的代码需要用进程池。

          进程池设定  CPU个数 + 1

        Pool池:

          apply  同步

          apply_async  异步提交

            get  获取返回值

            close

            join

          map

            apply_async的简化版

            它内部实现了close, join

            但是没有get方法,无法接受返回值。

          回调函数  apply_async(callback=???)

            回调函数是在主进程中执行的

            在子进程执行完任务之后立刻将结果返回给回调函数,被回调函数作为参数进行下一步的处理。

      信号量和池

        在同一时刻只会有n个进程在执行代码

        相似?不同?

          信号量是有多少任务开多少进程,信号量仍然给操作系统到来了很多负担。

          池中进程的数量是固定的,只是分别借用池中的进程来执行任务而已。

    1、线程

      线程是计算机中能被CPU调度的最小单位。

      进程是计算机中资源分配的最小单位。

      多线程的特点:

        并发;

        轻量级;

        数据不隔离。

      多进程的特点:

        并发的;

        操作比较重;

        数据完全隔离

    2、线程效率测试

     1 import os
     2 import time
     3 from threading import Thread
     4 
     5 
     6 # 线程  Tread
     7 
     8 def func():
     9     for i in range(10):
    10         print('in thread:', i, os.getpid())
    11         time.sleep(0.5)
    12 
    13 
    14 if __name__ == '__main__':
    15     t = Thread(target=func)
    16     t.start()
    17     time.sleep(1)
    18     print('in main', os.getpid())
    19     time.sleep(1)
    20     print('in main 2', os.getpid())
    效率测试
     1 D:Python36python.exe E:/Python/草稿纸.py
     2 in thread: 0 14936
     3 in thread: 1 14936
     4 in main 14936
     5 in thread: 2 14936
     6 in thread: 3 14936
     7 in main 2 14936
     8 in thread: 4 14936
     9 in thread: 5 14936
    10 in thread: 6 14936
    11 in thread: 7 14936
    12 in thread: 8 14936
    13 in thread: 9 14936
    14 
    15 Process finished with exit code 0
    结果

    3、数据隔离测试

     未完待续。。。 

    4、主线程和子线程

     未完待续。。。 

  • 相关阅读:
    Sqlite中文排序
    关于java中实现在oracle数据库中实现对中文首字母进行排序的解决方案
    Java面试题全集(下)
    Java面试题全集(上)
    更新Svn客户端后,右键菜单中没有TortoiseSVN
    Maven项目报错:Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clea
    华为机试题---1、字符串最后一个单词的长度
    ES6 类 继承
    JS 创建对象的几种方法(总结)
    80端口和8080端口的区别是什么
  • 原文地址:https://www.cnblogs.com/ZN-225/p/9188523.html
Copyright © 2020-2023  润新知