dday07

1.主线程


import _thread   # 多线程
import win32api

def show(i):
    # 0 代表系统,你真帅代表内容,来自JOKER代表标题,0代表窗口类型0,1,2,3
    mystr = win32api.MessageBox(0,"你真帅","来自Joker的问候",0)


for i in range(5):   # 这是小弟线程
    _thread.start_new_thread(show,(i,))  # 前面是执行函数,后面是一个元组,可以不写前提是函数没有形参


while True:  # 在这里加入死循环是为了脚本主线程不死,小弟线程才能运行
    pass


运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190822204806326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dhbmdfU2h1X0p1YW4=,size_16,color_FFFFFF,t_70)
2.多线程加速
```python
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")


运行结果:
0 -------
0 -------
0 -------
0 -------
0 -------
1 -------
1 -------
1 -------
1 -------
1 -------
2 -------
2 -------
2 -------
2 -------
2 -------
3 -------
3 -------
3 -------
3 -------
3 -------
4 -------
4 -------
4 -------
4 -------
4 -------
over

3.线程冲突

import _thread

num = 0
def add():
    for _ in range(1000000):
        global num
        num += 1
    print(num)
'''
for j in range(5):
    add()
'''
for i in range(5):
    _thread.start_new_thread(add,())
# 这里就是线程冲突,5个线程同时抢夺num的资源,导致最后结果错误
'''
1144840
1488805
1671079
1700819
1920182
'''
while True:  # 防止主线程不死
    pass

运行结果:
1637049
1747285
1810354
1822834
2017090

4.基于类实现多线程

import threading
import win32api
class Mythread(threading.Thread):   # 继承threading.Thread类
    def run(self):  # 重写threading.Thread类中的run函数
        win32api.MessageBox(0,"hello",'joker',0)
for i in range(5):  # 同时创建5个线程
    t = Mythread()  # 初始化
    t.start()  # 开启
while True:
    pass
运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190822210245727.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dhbmdfU2h1X0p1YW4=,size_16,color_FFFFFF,t_70)
5.类线程顺序风格

import threading
import win32api
class Mythread(threading.Thread): # 继承threading.Thread类
def run(self): # 定义函数
win32api.MessageBox(0,“hello”,‘joker’,0)
for i in range(5):
t = Mythread() # 初始化
t.start() # 开启
# 等待一个线程执行完毕,再执行下一个线程,一方面可以阻止脚本主线程死掉,另一方面也可以防止线程冲突的一种办法
t.join()
t.join() 如果将其放在外部的不确定因素是,系统给for 循环和下面的代码锁定了一片内存,当循环执行完成之后,
内存就开锁了,但是里面的东西还依然存在,所以才结束一个窗体,game over就出来了,
就和删除文件后,内存中可能还有文件一样的道理
print(“game over”)
运行结果:
在这里插入图片描述

6.类线程的乱序风格

```python
import threading
import win32api
class Mythread(threading.Thread):  # 继承threading.Thread类
    def __init__(self, num):
        threading.Thread.__init__(self)  # 父类初始化
        self.num = num
    def run(self):  # 定义函数
        win32api.MessageBox(0, "hello" + str(self.num), 'joker', 0)
        print(self.getName())  # 获取线程名
Mythd = []
for i in range(5):
    t = Mythread(i)  # 初始化
    print(i)
    t.start()  # 开启
    Mythd.append(t)  # 将乱序线程(同时抢夺run这个函数)加入列表

for j in Mythd:
    # 这里与顺序不同,上面显示所有的线程都加入Mthd列表(所以一次性跳出5个窗口,但是主线程还没死,因为有join卡住)。
    # j是线程
    j.join()  # 这里主线程同时等待所有线程都执行完毕,才执行“game over”
print("game over")
运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190822211608167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dhbmdfU2h1X0p1YW4=,size_16,color_FFFFFF,t_70)
7.死锁

```python
import threading
import time
boymutex = threading.Lock()  # 创建一个锁
girlmutex = threading.Lock()  # 创建一个锁
class boy(threading.Thread):
    def run(self):
        if boymutex.acquire(1):  # 锁定成功就继续执行,锁定不成功,就一直等待
            print(self.name + "boy  say i  am sorry   up")
            # time.sleep(3)  # 时间过短的话也可以并发执行,不会锁死

            if girlmutex.acquire(1):  # 锁定不成功,因为下面已经锁定
                print(self.name + "boy  say i  am sorry   down")
                girlmutex.release()
            boymutex.release()
class girl(threading.Thread):
    def run(self):
        if girlmutex.acquire(1):  # 锁定成功就继续执行,锁定不成功,就一直等待
            print(self.name + "girl say i  am sorry  up")
            # time.sleep(3)
            if boymutex.acquire(1):  # 锁定不成功,同理上面已经锁定一直等待
                print(self.name + "girl say i  am sorry  down")
                boymutex.release()
            girlmutex.release()
 开启两个线程
 boy1 = boy()   # Thread-1boy 第一个线程
boy1.start()
 girl1 = girl()
girl1.start()
'''
这种例子时间过短是无法很好的产生死锁
for i in range(10):
    Mythread1().start()
    Mythread2().start()

'''
for i in range(1000):
    boy().start()
    girl().start()

运行结果:
Thread-1boy  say i  am sorry   up
Thread-2girl say i  am sorry  up
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值