网络编程-线程-4、多个线程之间共享全局变量
知识点:什么叫共享全局变量?
举个应用场景:假如我有俩个方法,一个执行下载图片的,一个执行将下载的图片整理后发送给别人,按照之前单任务的方法就是等下载完后,再去执行发送图片,多任务就是下载和发送一起运行,此时他们共享同一个图片数据,这个数据就是
共享变量
1、下面用一个简单的代码演示一下共享全局变量:
# 定义一个全局变量,创建俩个线程,通过线程1区改变这个全局变量的值,你会发现线程2中的打印出来的全局变量值是线程1修改过后的值 num = 100 def test1(): global num # 因为num是不可变类型的,所以要修改全局变量的值必须加个global关键字才能修改它的值 num += 1 print('test1:%d'%num) def test2(): print('test2:%d'%num) def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() t2.start() print('num的值为:%d'%num) if __name__ == '__main__': main()
运行结果如下:
test1:101
test2:101
num的值为:101
2、补充知识点:
当我们创建线程的时候,如:t1 = threading.Thread(target=test1),我想往线程函数里传递参数怎么办呢?只需t1 = threading.Thread(target=test1,args=(需要传递的参数,)),args必须是一个元祖,以逗号隔开,看下面的例子:
import threading def test1(temp): temp.append(33) # 修改传递过来的列表 print('test1-num:%s' % str(temp)) def test2(temp): print('test2-num:%s' % str(temp)) num = [11, 22] def main(): t1 = threading.Thread(target=test1, args=(num,)) # 将num传递给线程函数test1,这里args是一个元祖,逗号一定要写 t2 = threading.Thread(target=test2, args=(num,)) # 将num传递给线程函数test2 t1.start() t2.start() print(num)
运行结果如下:
test1-num:[11, 22, 33]
test2-num:[11, 22, 33]
[11, 22, 33]