IOT python高级培训(三)

Python 多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:调用thread模块中的start_new_thread()函数来产生新线程。

thread.start_new_thread ( function, args[, kwargs] )
  • function - 线程函数。
  • args - 传递给线程函数的参数,他必须是个tuple类型。
  • kwargs - 可选参数。

多线程实例

"""
1.线程是最小单位
2.进程由线程构成
3.进程之间相互独立

"""
import time #时间函数
import threading#threading线程处理

def test(x):
    print(x)
    time.sleep(2)

t1=threading.Thread(target=test,args=(1,))#使用多线程函数实现同时工作
t2=threading.Thread(target=test,args=(2,))#使用多线程函数实现同时工作
test(1)
class MyThread(threading.Thread):#通过类实现多线程
    def __init__(self,n):
        self.n=n
    def run(self):
        print('以类的方式创建多线程',self.n)
        time.sleep(3)
r1=MyThread(1)
r2=MyThread(1)
r1.run()
r2.run()

多线程特性

import threading
import time


def run(x):
    print(f"线程{x}")
    time.sleep(2)
#print(time.time())#从1970年到现在走了多少秒

if __name__=='__main__':
#     for i in range(51):
#         t = threading.Thread(target=run,args=(i,))
#         t.start()
#     print(f"运行了{time.time() - start_time}")

# run(1)
#Tread(target=函数名称,args=参数用括号表示(1,))
    start_time=time.time()
    #
    res=[]
    for i in range(50):
        t=threading.Thread(target=run,args=(i,))
        # t2=threading.Thread(target=run,args=(2,))
        t.setDaemon(True)
        t.start()
        res.append(t)
    print(threading.active_count())

#在多线程中使用join函数代替wait

    # for i in res:
    #     i.join()


    print(f"运行了{time.time() - start_time}")
    print(threading.current_thread())#打印处于什么线程

线程锁

#线程锁
import threading


def run():
    global x
    lock.acquire()
    x+=1
    lock.release()
if __name__ == '__main__':
    x=0
    res=[]
    lock=threading.Lock()
    for i in range(100):
        t=threading.Thread(target=run)
        t.start()
        res.append(t)
    for t in res:
        t.join()
    print(x)
"""
x=5 16 17 x=6
"""

递归锁

import threading

#RLOCK
def run1():
    global x
    lock.acquire()#锁2
    x+=1
    lock.release()#锁2
    return x
def run2():
    global y
    lock.acquire()
    y += 1
    lock.release()
    return y
def run3():
    lock.acquire()#锁1
    res1=run1()
    res2=run2()
    lock.release()#锁1
    print(res1,res2)
if __name__ == '__main__':

    x=0
    y=0
    lock=threading.RLock()#解决嵌套锁在函数中无法出来的问题
    for i in range(50):
        t=threading.Thread(target=run3)
        t.start()
    while threading.active_count()!=1:
        print(f"正在运行{threading.active_count()}个线程")
    print("结束")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值