zoukankan      html  css  js  c++  java
  • python-多线程

    ---------------------------------进程与线程----------------------------

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

    有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

    进程:同时利用多个cpu,但耗费资源

    一个进程内的所有线程共享相同的全局内存、全局变量等信息,这种机制又带来了同步问题。

    多线程服务器是对多进程服务器的改进

    由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程

    多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。

    --------------------- ------------------thread模块-------------------------------------------------------------------------

    threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。

    threading模块提供的类:  
      Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。

    threading 模块提供的常用方法: 
      threading.currentThread(): 返回当前的线程变量。 
      threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 
      threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

    threading 模块提供的常量:

      threading.TIMEOUT_MAX 设置threading全局超时时间。

    1.1 Threading模块中的Thread

    1.1.1Class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

    新建线程 :

    实例化类 t = threading.Thread(target=loop, name='LoopThread' )

    1. ,target传入子线程要 运行的 函数

    2.,target传入一个 类对象

    3.创建Thread 的一个子类  class  Mythread(threading.Thread)

    t.start() 开始线程

    t.join 阻塞 calling thread(通常为主线程),直到线程t终止

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

    线程中使用锁

    锁的好处就是确保了某段关键代码只能由一个线程从头到尾完整地执行,坏处当然也很多,首先是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了。其次,由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁,导致多个线程全部挂起,既不能执行,也无法结束,只能靠操作系统强制终止。

    ???可以存在多个锁

    ---------------------------localdata-------------------------------------------------------------------------2

    local_school = threading.local()

    ============================sockeserver模块=======================================================

    tcp 多线程服务器?

    1.为了能够让多个客户端同时接入服务并进行通信,服务端将使用SocketServer模块来实现.......然后读源码,看看是怎么回事

      socketserver+ threadingMIXin

    socketserver

    4个基本的server class

    RequestHandler class

    创建server的步骤:1创建 request handler ,by 继承 base request handler .并类,并重写里面的handle函数,这个函数处理请求. 2.实例化服务器类,request handler 类传进去. 3 调用servermethod执行.4 关闭

    ================同步 异步 阻塞 非阻塞======================================== 


    创建服务器的forKing threading版本.例如:threadingUdpServer的创建:class ThreadingUDPServer(ThreadingMixIn, UDPServer):

    你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
    而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过回电这种方式来回调。

    2. 阻塞与非阻塞
    阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

    阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

    还是上面的例子,
    你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己挂起,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
    在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。


  • 相关阅读:
    Android studio 克隆分支
    香蕉派 banana pi BPI-M3 八核开源硬件开发板
    Visual F# Power Tools 简单介绍
    win764bit系统plsqldeveloper11连接oracle11g64bit配置方法
    cocos2d-x 模态对话框的实现
    《AndroidStudio每日一贴》2.高速查看项目中近期的变更
    Android百日程序 开篇章:Intent打开网页
    Linux应用server搭建手冊—Weblogic服务域的创建与部署
    HDU 5623 KK's Number(DP)
    JAVA之堆内存和栈内存的差别
  • 原文地址:https://www.cnblogs.com/zyhe/p/10009715.html
Copyright © 2011-2022 走看看