Python Day07

来自Python的问候

下面开启我们今天美好的课程,我们学习的是线程:

  • 多线程就像同时执行多个不同程序
  • Python3 线程中常用的两个模块为:
    _thread
    threading
  • 使用线程有两种方式:函数或者用类来包装线程对象。
  • 使用函数:
    调用 _thread 模块中的start_new_thread()函数来产生新线程。
import _thread   #多线程
import win32api


def show(i):
    mystr = win32api.MessageBox(0,"你真帅","我来啦",0)


for i in range(5):
    _thread.start_new_thread(show,(i,))

while True:
    pass  

1. 多线程抢占cpu

import _thread
import time
def go():
    for i in range(5):
        print(i,"-------")
        time.sleep(1)

for i in range(5):   # 同时执行5次
    _thread.start_new_thread(go,())

for j in range(6): # 让主线程卡顿6秒
    time.sleep(1)

print("over")

2. 基于类实现多线程

  • 使用 threading 模块创建线程
    我们可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即调用了线程的 run() 方法。
import threading

class Tom(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.NUM = 0
    def run(self):
        for _ in range(1000):
            self.NUM += 1
        print(self.NUM)

if __name__ == "__main__":
    ts = []
    for i in range(5):
        t =Tom()
        t.start()
        ts.append(t)

    for t in ts:
        t.join()
    
    print('Over')

3. 线程冲突

import _thread

num = 0
def add():
    for _ in range(1000000):
        global num
        num += 1
    print(num)
for i in range(5):
    _thread.start_new_thread(add,())

while True:  # 防止主线程不死
    pass


在这里插入图片描述
这里就是线程冲突,5个线程同时抢夺num的资源,导致最后结果错误。

4. 线程同步
锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。

import threading

num = 0
mutex = threading.Lock()  # 创建一个锁,threading.Lock()是一个类


class Myhtread(threading.Thread):
    def run(self):
        global num
        if mutex.acquire(1):  # 如果锁成功,那么线程继续干活,如果锁失败,下面的线程一直等待锁成功,1,代表独占
            for i in range(1000):  # 数字小的时候还是不会产生线程冲突的
                num += 1
            mutex.release()  # 写完一定要解锁
        print(num)


mythread = []
for i in range(3):
    t = Myhtread()
    t.start()
    mythread.append(t)

for thread in mythread:
    thread.join()  

print("over")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值