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