网络编程 之线程

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




















猜你喜欢

转载自www.cnblogs.com/fanbiyong/p/10208881.html