python多任务-线程

threading
python 实现多任务可是使用线程、进程、协程,本文介绍python线程解决多任务,多线程共享全局变量,共享全局变量就会造成资源竞争,解决资源竞争可是使用互斥锁,使用互斥锁会赵成的问题是阻塞,一个主线程中多个子线程使用多个互斥锁的情况会造成死锁。

以上问题解决方法:
资源竞争:解决资源竞争使用互斥锁
互斥锁:什么是互斥锁,直白的说就是,谁先拿到谁先上锁,上锁后别人就不能再上锁也不能再使用
解决阻塞:解决阻塞的意思就是,上锁的代码越少越好,但是又会造成另外一个问题,就是会频繁的上锁解锁,这个也是需要时间,所以具体的选择要看业务需求,这个无法十全十美
死锁:就是一个主线程中有多个子线程,又有多个互斥锁,他们都在相互的等待对方的资源,就会造成死锁,1、解决死锁的方法就是给互斥锁添加超时时间\2、程序设计的时候避免,也就是使用银行家算法

并行与并发

1、并行 :真的多任务(CPU核数>任务数)
1、并发 :假的多任务(CPU核数<任务数)[计算机底层实现,可能是时间切片,也可能是优先级调度]

知识点

1、多线程中,主线程等待子线程结束后再结束
2、多线程共享全局变量
3、线程是资源调度的最小单位

多线程造成的问题

1、资源竞争的问题
2、使用互斥锁解决资源竞争会出现的情况是会造成阻塞(还是单任务)
2、一个主线程里多个子线程。使用多个互斥锁的情况会造成的问题是死锁

解决多线程的问题

1、使用互斥锁(在可能出现资源竞争的地方使用互斥锁)
2、使用互斥锁的原则是,上锁的代码越少越好(同样的问题是会造成加锁和上锁的耽误时间)
解释互斥锁:互斥所的特性,同一把锁,只能上锁一次,这样就能保证同意时刻是能有一个对象上锁

mutex = threading.Lock()  # 创建锁对象(对象默认是没有锁上的状态)
mutex.acquire() # 上锁
mutex.release() # 解锁

1、多线程传参

import threading
import time

def test1(temp):
    temp.append(33)
    print("-----in test1 temp=%s----" % str(temp))


def test2(temp):
    print("-----in test2 temp=%s----" % str(temp))


g_nums = [11, 22]

def main():
    # target指定将来 这个线程去哪个函数执行代码
    # args指定将来调用 函数的时候 传递什么数据过去
    t1 = threading.Thread(target=test1, args=(g_nums,))    # 参数接收的为元组
    t2 = threading.Thread(target=test2, args=(g_nums,))

    t1.start()    # 开始线程
    t2.start()


if __name__ == "__main__":
	main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值