• python学习笔记(13):python并发编程以及系统常用模块


    一、进程与线程

      1.进程:程序的一次执行(程序装载入内存,系统分配资源运行)。n 每个进程有自己的内存空间、数据栈等,只能使用进程间通讯,而不能直接共享信息

      2.线程:所有线程运行在同一个进程中,共享相同的运行环境。    

        (1)n 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。

        (2) 线程的运行可以被抢占(中断),或暂时被挂起(睡眠),让其他线程运行(让步)。n     (3)一个进程中的各个线程间共享同一片数据空间。

    二、全局解释器锁GIL

      1.GIL全称全局解释器锁Global Interpreter Lock,GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念

      2.GIL是一把全局排他锁,同一时刻只有一个线程在运行

        (1) 毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序

        (2)multiprocessing库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,因此也不会出现进程之间的GIL争抢

    # 顺序执行多个单线程和同时执行多个并发线程效率比较,下面实现两个线程顺序执行
    from threading import Thread
    import time
    
    def my_counter():   #定义一个顺序数数的函数
        i = 0
        for _ in range(10000):
            i= i +1
        return True
    
    def main():
        thread_array={}
        start_time=time.time()
        for tid  in range(2):
            t = Thread(target=my_counter)
            t.start()  #同时开始两个线程
            thread_array[tid]=t
        for i in range(2):
            thread_array[tid] = t
        for i in range(2):
            thread_array[i].join()
        end_time=time.time()
        print("Total time:{}".format(end_time-start_time))
    
    if __name__=='__main__':
        main()
    from threading import Thread
    import time
    def my_counter():
        i = 0
        for _ in range(100000):
            i = i+1
        return True
    def main():
        thread_array={}
        start_time = time.time()
        for tid in range(2):   # 两个线程顺序执行
            t = Thread(target=my_counter)   # 将数数的线程调用进来
            t.start()
            t.join()
        end_time = time.time()
        print("Total time:{}".format(end_time-start_time))
    
    if __name__=='__main__':
        main()

    三、python多进程

    fork操作:

      n 调用一次,返回两次。因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。子进程只需要调用getppid()就可以拿到父进程的ID

    四、multiprocessing

    multiprocessing是跨平台版本的多进程模块,它提供了一个Process类来代表一个进程对象

    五、进程间通信Queue

    Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递

  • 相关阅读:
    Sublime 下配置vim模式 + VintageEx-master下载地址
    Potplayer快捷键
    Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法
    最快速的Android开发环境搭建ADT-Bundle及Hello World
    Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
    X-Mirage苹果屏幕录制工具7天试用期破解 imsoft.cnblogs
    玩转博客园的心路总结
    玩转博客园的5个小技巧
    五个对你有用的Everything搜索技巧
    PS如何批量处理图片
  • 原文地址:https://www.cnblogs.com/bigdata-stone/p/10199167.html
Copyright © 2020-2023  润新知