• 网络编程 之线程


    # 进程都默认拥有一条主线程,线程相当于流水线,进程相当于车间.
    #什么是线程:程序的执行线路,相当于一条流水线,其包含了程序的具体执行步骤.
    # 进程中包含了运行该程序需要的所有资源,进程是资源单位,线程是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()      




















  • 相关阅读:
    C#库
    大话设计模式--简单工厂模式
    weka平台下手动造.arff的数据
    NIM博弈的必胜取法
    求一个全排列函数: 如p([1,2,3])输出:[123],[132],[213],[231],[312],[321]. 求一个组合函数 如p([1,2,3])输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]
    哥德巴赫猜想
    C#格式化输出
    meta文件里指定资源
    chromatic aberration
    uber shader
  • 原文地址:https://www.cnblogs.com/fanbiyong/p/10208881.html
Copyright © 2020-2023  润新知