zoukankan      html  css  js  c++  java
  • python多线程,多进程编程。

    进程,是目前计算机中为应用程序分配资源的最小单位;

    线程,是目前计算机中运行应用程序的最小单位;

    在实际系统中,其实进程都是被分为线程来实现的,所以参与时间片轮转的是线程

      但是管理应用程序的资源的单位和任务调度的单位都是进程。更像是一个逻辑概念。

    线程是进程分出来的更精细的单位,线程间的上下文切换比进程间的上下文切换,要快很多。

      

    多进程与多核,这个概念很奇怪,因为进程是不会直接在核心上运行的。

    多线程与多核,涉及一个内核线程与用户线程的对应关系

    内核线程(Kernel Thread),一般与核心是一一对应的,一个处理核心对应一个内核进程。

    目前的计算机,配置一般都是超线程的,即通过硬件冗余,将一个物理核心模拟成两个逻辑处理核心

      对应两个内核线程。所以在操作系统中看到的CPU是实际物理核心的两倍。

      如双核四线程,四核八线程

    ------------------------------------------------------------------------

      intel的cpu为了实现分支预测等技术,一般每个内核的运算单元是双份的,-------超线程

      服务器方面的物理核心的运算单位,可能会更多,支持更大的超线程

    ------------------------------------------------------------------------

    用户线程与内核线程的对应关系:

      1) 一一对应,由于内核线程很少,所以限制了很多用户线程的执行数量;

      2) 多对一,用户线程很慢,影响调度;

      3) 多对多,目前应用的模式,

      

    python中的多进程库,multiprocessing,提供的方法和属性:

    属性:authkey,daemon(父进程终止后,自动结束子进程,必须在start之前设置),exitcode,name,pid

    方法: Process(target,name,args,kwargs),创建进程对象

        is_live(),进程状态

        join('timeout'),表示等待后台的进程运行结束,如果指定timeout,一定时间后,杀掉进程

        run(),

        start(),

        terminate(),

        join(),等所有的后台子进程执行好;

        cpu_count(),返回当前拥有的cpu的个数,超线程之后的。

    进程创建时,target可以指定为一个函数,也可以直接例化一个进程class。

    创建函数process:

        

    创建class进程,start()之后,会自动调用run()函数:

        

    加入daemon属性:并不会等到该worker的process结束,程序就执行结束了。

        

    多进程遍历:active_children()

        

    还可以加入lock,semaphore,实现对共享资源的控制,event,进程间通信。

      还有进程队列(Queue),和进程管道(Pipe)

    Pool,进程池,不需要自己在管理进程的数量,进程池自动管理。

        如果池中的进程数量达到阈值,阻塞其他进程。

    参考博客

    https://www.cnblogs.com/kaituorensheng/p/4445418.html

    python中的多线程,好像不是特别的好用,python内部有一个global interpreter lock(GIL),它阻碍了

      python的多线程程序的同时运行。python中也有多线程的模块,threading模块。

    有人做过实验,在CPU密集型的任务中,多线程并不能有多少效率上的提升,反而因为上下文的切换,降低效率。

                     而多进程,可以在多个core中并行的跑,效率会提高。

           在IO密集型的任务中,多线程和多进程,都会带来性能的提高。

           在网络请求密集型的任务中,多线程与多进程,相差无几。

    多进程可以发挥多核芯片的性能,在一个进程中,可以在实现多线程的操作,来频繁调度,防止IO的阻塞。

  • 相关阅读:
    SQL Server ->> Natively Compiled Stored Procedures(本地编译存储过程)
    Linux ->> <user_name> not in the sudoers file. This incident will be reported.
    Linux ->> Ping命令
    Linux ->> UBuntu 14.04 LTE下主机名称和IP地址解析
    Linux ->> UBuntu ->> Could not get lock /var/lib/dpkg/lock
    Linux ->> scp命令复制对端机器上的文件/文件夹
    Linux ->> UBuntu 14.04 LTE下安装Hadoop 1.2.1(伪分布模式)
    Linux ->> UBuntu 14.04 LTE下设置静态IP地址
    .Net ->> iTextSharp工具读取PDF文本内容
    oracle case用法
  • 原文地址:https://www.cnblogs.com/-9-8/p/8269701.html
Copyright © 2011-2022 走看看