zoukankan      html  css  js  c++  java
  • 网络编程 之线程

    # 进程都默认拥有一条主线程,线程相当于流水线,进程相当于车间.
    #什么是线程:程序的执行线路,相当于一条流水线,其包含了程序的具体执行步骤.
    # 进程中包含了运行该程序需要的所有资源,进程是资源单位,线程是cpu的最小执行单位
    # 进程包含线程而线程依赖于进程
    # 进程对系统的资源消耗非常的高
    # 多线程可以让cpu在一个进程内切换,从而提高cpu占用率

    二 .开启多线程的两种方式 对比多进程实际是一样的方式
    1.实例化Thread
    2.继承Thread类 覆盖 run方法
    from threading import Thread
    def task():
      print('threading running')
    t1 = Thread(target = task,)
    t1.staet()
    print('over')

    第二:继承
    class MyThread(Thread):
      def run(self):
        print('子线程running')
    MyThread().start()
    print('over')

    三:
    什么情况下开启多线程
    当程序中遇到IO操作的时候
    当程序中是纯计算任务,即使开多线程也无法提高效率
    进程和线程的区别:
    1.所有的同一个进程内的线程共享这个进程中的所有数据资源
    2.进程对于操作系统的资源消耗非常高,而线程比较低大概的倍数10-100倍
    例子:
    100个线程和100个进程开启时间的对比:
    from multiprocessing import Process
    from threading import Thread
    import time
    def task():
        pass
    
    100个进程时间统计
    if __name__ == '__main__':
        start= time.time()
        ps=[]
        for i in range(100):
            p = Process(target=task)
            p.start()
            ps.append(p)
        for p in ps:
            p.join()
    
        print(time.time()-start)
    
    100个线程时间
    
    start= time.time()
    ts  = []
    for i in range(100):
        t = Thread(target=task)
        t.start()
        ts.append(t)
    for t in ts:
        t.join()
    print(time.time()-start)

    线程中的一些常规使用属性 

    # from threading import enumerate,current_thread,active_count
    # 获取所有线程对象列表 print(enumerate())
    # 获取当前线程 print(current_thread())
    # 获取当前正在进行的线程个数 print(active_count())

    四:线程互斥锁
    import time
    from threading import  Thread,Lock
    lock = Lock()
    a =100
    def task():
        lock.acquire()
        global a
        temp = a - 1
        time.sleep(0.01)
        a = temp
        lock.release()
    ts = []
    for i in range(100):
        t = Thread(target=task)
        t.start()
        ts.append(t)   将进程对象加入列表
    for t in ts :      循环列表中的进程为其添加join 让主线程等待其他子线程全部执行完后再执行
        t.join()
    print(a)

    五.信号量 

    其实也是一种锁,特点是可以设置一个数据被多个线程(进程共享)

    对比普通锁的区别:

    普通锁: 一旦加锁则意味着.这个数据只能被同时一个人使用,信号量可以在同一个时间被多个线程使用

    作用可以防止数据被同时访问过载,限制访问的线程个数

    
    
    from threading import  Semaphore,Thread,current_thread
    import time,random
    sem = Semaphore(3)   #设置同时可以多少个线程访问数据执行
    
    def task():
        sem.acquire()
        print('%s run.....'%current_thread())
        time.sleep(3)    #3个线程一批的执行 
        sem.release()
    for i in range(10):
        t = Thread(target=task)
        t.start()      




















  • 相关阅读:
    js 经纬度计算直线距离
    lua 把图片转换成base64
    js 选中div中的文本
    .net EasyTree显示所级层级(无限级、整层级颗树)的另类写法。非递归
    c# windows服务 一个项目安装多个服务
    MD5 .net与PHP加密值一样的加密代码
    mvc 目录不存在/Directory does not exist.的解决方案
    .net webapi项目中支持session
    .net 中HttpClient 携带cookie传输
    iis虚拟目录或应用程序不继承父站点的web.config配置信息
  • 原文地址:https://www.cnblogs.com/fanbiyong/p/10208881.html
Copyright © 2011-2022 走看看