多线程的应用学习笔记

1.创建线程的基本方法

① 继承Thread

import threading


# 第一种 继承Thread
class MyThread(threading.Thread):
    def __init__(self, thread_name):
        super(MyThread, self).__init__(name=thread_name)

    def run(self):
        print("%s 在执行中..." % self.name)


for i in range(10):
    MyThread("testThread" + str(i)).start()

for i in range(10): 添加10个子线程

② 不使用类的方法

import threading


def show(num):
    print('当前线程: %d 在执行...' % num)


for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

2.守护线程

① 模拟子线程处理时间

import threading
import time


def dowaiting():
    print('子线程开始等待...')
    time.sleep(3)
    print("子线程执行结束")


print("主线程开始")
t = threading.Thread(target=dowaiting)
t.start()

print("主线程的其他操作")

t.join()  # 合并主线程子线程,让主线程等待子线程执行完毕
print("主线程结束")

使用 join( )会让程序成为单线程,慎用join( )

② 增加线程名

import threading
import time


def dowaiting():
    print(threading.current_thread().getName() + '子线程开始等待...')
    time.sleep(3)
    print(threading.current_thread().getName() + "子线程执行结束")


print("主线程开始")
for i in range(3):
    t = threading.Thread(target=dowaiting)
    t.start()

print("主线程结束")

③ 由主线程控制子线程的开始和关闭 (子线程为守护线程)

import threading
import time


def dowaiting():
    print(threading.current_thread().getName() + '子线程开始等待...')
    time.sleep(3)
    print(threading.current_thread().getName() + "子线程执行结束")


print("主线程开始")
for i in range(3):
    t = threading.Thread(target=dowaiting)
    t.setDaemon(True)  # 主线程控制子线程
    t.start()

print("主线程结束")

.setDameon( ) 默认为False

3.线程安全

① 线程不安全,脏数据

import threading
import time

number = 0


def add():
    global number
    for _ in range(1000000):
        number += 1
    print("子线程 %s 执行结束后: number = %d" % (threading.current_thread().getName(), number))


for i in range(2):
    t = threading.Thread(target=add)
    t.start()

time.sleep(3)
print("主线程结束,number = " + str(number))  # 结果为两个数按顺序轮流各自加自己的数,互不相关,Thread-2没有加上Thread-1,没有达到算出2000000的结果
# Thread-1: 1000
# Thread-2: 1000
# Thread-1: 2345
# Thread-2: 2456
# ...

global + 含数的变量 作用: 在局部函数对全局变量重新赋值

② 线程锁_with语句

import threading
import time

number = 0
lock = threading.Lock()


def add(lk):  # lock为局部变量,需要传入方法中
    global number
    # 加锁
    with lk:
        for _ in range(1000000):
            number += 1
        print("子线程 %s 执行结束后: number = %d" % (threading.current_thread().getName(), number))
        # 解锁



for i in range(2):
    t = threading.Thread(target=add, args=(lock,))
    t.start()

time.sleep(3)
print("主线程结束,number = " + str(number))

args= 作用: 传入参数

③ 线程锁_互斥锁

import threading
import time

number = 0
lock = threading.Lock()


def add(lk):
    global number
    # 加锁   独占线程
    lk.acquire()
    for _ in range(1000000):
        number += 1
    print("子线程 %s 执行结束后: number = %d" % (threading.current_thread().getName(), number))
    # 解锁
    lk.release()


for i in range(2):
    t = threading.Thread(target=add, args=(lock,))
    t.start()

time.sleep(3)
print("主线程结束,number = " + str(number))

互斥锁:同一时刻只能被一个线程访问
for _ in range( ):中" _ " 表示无意义

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值