美文网首页
无标题文章

无标题文章

作者: yanqing001 | 来源:发表于2017-07-13 11:46 被阅读0次

    1. socketservers

    1) server = socketserver.TCPserver((HOST,PORT),MyTCPHandler) # 实例化一个 server  
                socketserver.TheadingTCPserver()                 # 多线程  
                socketserver.ForkingTCPserver()               # 多进程  
    2) server.handle_request() # 仅处理一个请求
       server.serve_forever()  # 处理多个请求
    3) server_close() 关系 socketserver
    

    2. paramiko 模块

    import paramiko
    ssh = paramiko.SSHClient()
    

    3. 进程、线程

    方法
    start()         # 线程准备就绪,等待CPU调度
    setName()       # 为线程设置名称
    getName()       # 获取线程名称
    setDaemon(True) # 设置为守护线程
    join()          # 逐个执行每个线程,执行完毕后继续往下执行
    run()           # 线程被cpu调度后自动执行线程对象的run方法,如果想自定义线程类,直接重写run方法就行了
    
    线程进程的区别:
    1.同一个进程中的线程共享同一内存空间,但是进程之间是独立的。
    2.同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。
    3.对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
    4.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。
    5.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
    6.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。
    7.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
    8.线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。
    

    python的线程中没有优先级、线程组,也不能被停止、暂停、恢复、中断,线程只能随着线程中的代码执行完毕而被销毁。

    守护线程
    t.setDaemon(True) # 把子线程变成守护线程
    t.start() # 开始线程

    扩展阅读:
    搞定python多线程和多进程
    由浅入深:Python多线程编程详解

    4.GIL

    5.互斥锁

        lock = threading.lock() # 创建锁
        lock.acquire()          # 请求锁
        lock.release()          # 释放锁
    

    6.递归锁

        lock = threading.Rlock()
    

    7.信号量

        semaphore = threading.BoundedSemaphore(5)   #最多同时允许5个线程同时运行
    

    8.Events 事件

        event = threading.Event()
        event.clear         # 将flag设置为“False”
        event.set           # 将flag设置为“True”
        event.is_set        # 判断是否设置了flag,用来初始化状态
        event.wait          # 会一直监听flag,如果没有检测到flag就一直处于阻塞状态
    

    9.队列

        import queue
        q = queue.Queue(maxsize = 3) # 实例化一个队列(先入先出),最多放3个元素
        q = queue.LifoQueue()        # 实例化一个队列(后入先出)
        q = queue.PriorityQueue()    # 实例化一个队列(可设置优先级)
        q.put()                      # 放入队列
        q.qsize()                    # 队列大小
        q.get()                      # 从队列取数据
        q.get_nowait()               # 如果取不到会抛出一个异常
    

    10.定时器

     定时 n 秒后执行操作
    
        from threading import Timer
        def hello():
            print("hello, world")
    
        t = Timer(1, hello)
        t.start()                   # after 1 seconds, "hello, world" will be printed
    

    11.多线程的使用场景:

    • IO操作不占用CPU
    • 计算占用CPU
    • python 多线程不适合 CPU 密集操作型的任务,适合IO操作密集型的任务

    12.多进程语法:

        from multiprocessing import Process
        def f():
            print("123")
        p = Process(target=f, args=('bob',))
    

    13.进程之间数据交换

    进程之间数据是不共享的,所以不会出现多线程GIL带来的问题。多进程之间的通信通过Queue()或Pipe()来实现  
        Queue()     # 使用方法跟threading里的queue差不多
        pips()      # Pipe的本质是进程之间的数据传递,而不是数据共享,这和socket有点像
        manager()   # 通过Manager可实现进程间数据的共享。
                      Manager()返回的manager对象会通过一个服务进程,来使其他进程通过代理的方式操作python对象。
                      manager对象支持 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition,
                                     Event, Barrier, Queue, Value ,Array.
    
    • 示例:
        from multiprocessing import Process, Manager
            with Manager() as manager:
                d = manager.dict()
                l = manager.list(range(5))
    

    14.进程锁

    lock = lock()
        进程锁存在的意义:共享设备,例如标准输出设备等
    

    15.进程池

        apply()         # 同步执行(串行)
        apply_async()   # 异步执行(并行)
        terminate()     # 立刻关闭进程池
        join()          # 主进程等待所有子进程执行完毕。必须在close或terminate()之后。
        close()         # 等待所有进程结束后,才关闭进程池。
    
      windows 启动多进程:
      必须加入: if __name__ == '__main__':
    
      # callback  [回调函数]执行后再调用(通过主进程调用)
      注:
        poll.close()
        poll.join()    # 必须先close 再 join
    

    16.协程

        安装 Creenlet    # Creenlet 手动切换  gevent 启动切换(对 gevent 的封装)
        import Greenlet
        gr1 = greenlet(test1)   # 启动一个协程
        gr2 = greenlet(test2)
        gr1.switch()
    

    17.gevnet 爬网页

        import urllib
    
        # urllib 默认 不知道 gevent 需要monkey.path_all()
         monkey.path_all() # 把但钱程序的所有的IO操作做标记
    

    18.事件驱动

    19.多路IO复用/异步IO复用

        select.select(inputs,outputs,)
    

    相关文章

      网友评论

          本文标题:无标题文章

          本文链接:https://www.haomeiwen.com/subject/grjwhxtx.html