python多任务之多线程

python中出去多进程外还有多线程可以进行多任务,多线程可以共享全局变量,多进程不行,多进程可以使用多核,多进程不

多线程与多进程的使用方法基本差不多:

#导入多线程包
import threading
#创建执行体
def test01():
    for i in range(10):
        print("A")
def test02():
    for i in range(10):
        print("B")
if __name__ == "__main__":
#创建线程
    t1 = threading.Thread(target = test01)
    t2 = threading.Thread(target = test02)
#启动线程
    t1.start()
    t2.start()

python中的线程可以共享全局变量那么凭什么进程不行线程就可以了呢,这里吐槽一句python中的线程是假的

那么有人就问了这个执行函数不是没法传参了嘛,线程的传参方法与进程一模一样,请上嘉宾

#导入多线程包
import threading
#创建执行体
def test01(A):
    for i in range(10):
        print(A)
def test02(B):
    for i in range(10):
        print(B)
if __name__ == "__main__":
#创建线程,线程传参用的也是args和kwargs,一样是元组和字典的方式去传入参数
    t1 = threading.Thread(target = test01,args = (1,))
    t2 = threading.Thread(target = test02,kwargs = {"B":2})
#启动线程
    t1.start()
    t2.start()

那么线程独有的东西来了,他能共享全局变量并且是无序执行那么加入我有个a += 1当我第一个线程读取了a但是并并加1了但是没来得急去赋值给a但是我线程二同时也加了1并赋值给了a这时第一个线程的a还是在线程二没加之前的值那么他继续执行赋值此时就会发现我两个线程都执行了加一但是a的值只加了一,这是这两个线程就会出现争抢数据的情况,那么我们怎么解决的呢,这里有两种方法,一种是使用join方法去阻塞线程,一种是给变量上个锁

第一种方法join,上演员:

#导入多线程包
import threading
#创建执行体
a = 0
def test01():
    gloabl a
    for i in range(10):
        a += 1
        print(a)
def test02():
    gloabl a
    for i in range(10):
        a +=1
        print(a)
if __name__ == "__main__":
#创建线程
    t1 = threading.Thread(target = test01)
    t2 = threading.Thread(target = test02)
#启动线程
    t1.start()
    t1.join()
    t2.start()

第二种方法上锁,上演员:

#导入多线程包
import threading
#创建执行体
a = 0
t1_lock = threading.Lock()
def test01():
    gloabl a
    t1_lock.acquire()
    for i in range(10):
        a += 1
        print(a)
    t1_lock.release()
def test02():
    gloabl a
    for i in range(10):
        a += 1
        print(a)
if __name__ == "__main__":
#创建线程
    t1 = threading.Thread(target = test01)
    t2 = threading.Thread(target = test02)
#启动线程
    t1.start()
    t2.start()

这里注意锁乱用的话可以会导致死锁解不开的那种,锁这里的作用是让这部分的代码双车道变成单车道,所以在什么时候上锁,要考虑,锁上的好车子跑得快

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值