python多线程

线程也是实现多任务的另一种方式

线程是进程中执行代码的一个分,线程的执行需要cup调度完成

1、线程之间的执行使无序的

2、主线程会等待所有子线程执行结束再结束

def task():
    for i in range(5):
        print("test",i)
        time.sleep(0.5)

if __name__ == "__main__":
    # 进程守护
    task_thread = threading.Thread(target=task,daemon=True)
    task_thread.start()
    time.sleep(1)
    print("over")

当主线程完成后子线程就自动结束,这里用到的是daemon=True,默认daemon=Fasle,当子线程完成后才结束。【守护主线程】

def task():
    for i in range(5):
        print("test",i)
        time.sleep(0.5)

if __name__ == "__main__":
    # 进程守护
    task_thread = threading.Thread(target=task)
    task_thread.setDaemon(True)
    task_thread.start()
    time.sleep(1)
    print("over")

使用.setDaemon(True)设置守护主线程。

3、线程之间共享全局变量

join:主线程等待添加数据的子线程执行完毕再继续往下执行,添加完再执行的,可以使线程有先后的顺序

import threading
import time

def dance(name):
    for i in range(3):
        print(f"Dance{name}")


def sing(name):
    for i in range(3):
        print(f"SING{name}")


if __name__ == "__main__":
    # sing_thread = threading.Thread(target=sing,kwargs={'name':'hjw1'})
    dance_thread = threading.Thread(target=dance,args=('hjw',))
    # sing_thread.start()
    sing_thread = threading.Thread(target=sing,args=('hjw123',))
    dance_thread.start()
    dance_thread.join()
    sing_thread.start()
    sing_thread.join()

结果为:

Dancehjw
Dancehjw
Dancehjw
SINGhjw123
SINGhjw123
SINGhjw123

4、线程之间共享全局变量数据出现错误问题

g_sum = 0
def sum_num1():
    for i in range(1000000):
        global g_sum
        g_sum += 1
    print('sum',g_sum)

def sum_num2():
    for i in range(1000000):
        global g_sum
        g_sum += 1
    print('sum',g_sum)

if __name__ == '__main__':
    one_task_thread = threading.Thread(target=sum_num1)
    two_task_thread = threading.Thread(target=sum_num2)
    one_task_thread.start()
    two_task_thread.start()

运行结果:

sum 1222845
sum 1811120

这里我们使用线程同步

a、线程等待

g_sum = 0
def sum_num1():
    for i in range(1000000):
        global g_sum
        g_sum += 1
    print('sum',g_sum)

def sum_num2():
    for i in range(1000000):
        global g_sum
        g_sum += 1
    print('sum',g_sum)

if __name__ == '__main__':
    one_task_thread = threading.Thread(target=sum_num1)
    two_task_thread = threading.Thread(target=sum_num2)
    one_task_thread.start()
    one_task_thread.join()
    two_task_thread.start()

结果为:

sum 1000000
sum 2000000

b、互斥锁

g_sum = 0
# 创建互斥锁
look = threading.Lock()
def sum_num1():
    look.acquire()
    time.sleep(4)
    for i in range(1000000):
        global g_sum
        g_sum += 1
    print('sum',g_sum)
    look.release()

def sum_num2():
    look.acquire()
    time.sleep(2)
    for i in range(1000000):
        global g_sum
        g_sum += 1
    print('sum',g_sum)
    look.release()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值