田小花语音机器人(四)使用网络通讯解决多线程间的数据共享问题——使用python threading类

本篇分成两部分,证明线程间通信很难实现、使用网络解决线程间数据通信的问题。

——————————————————————————————————————————

解释一下哦 参考:线程间通信——数据传递和同步

线程间数据传递会产生两个问题:
1)竞争
两个线程同时修改一个变量,后一个人的修改会覆盖前一个人的修改,这种情况叫做竞争。
2)死锁
当一个线程占用资源A而请求资源B,另一个线程占用资源B而请求资源A,两个线程都无法继续运行,这种情况叫做死锁。

所以使用普通方法是不能两个线程使用同一个变量的!!! 卒 T_T

参考这篇文章:Python3-threading.local()代替普通全局变量 找到半个解决办法,使用thread线程的threading.local()方法可以建立一个所有线程都可以使用的变量。
比如value = threading.local() 则建立了一个全局字典,这个全局字典可以直接在某一个线程里调用,比如在子线程1里面可以直接使用value.value_1 = 0这样的操作。

但是并不能达到数据共享的目的,只是把变量的名字共享了!!!!

实现代码如下:

#!/usr/bin/python
#encoding:utf-8

import threading
import time
#创建全局ThreadLocal对象
local_value=threading.local()
local_value.i = 2
#
def function():
    #for local_value.i in range(5):
    local_value.i = 0
    print(threading.current_thread().name, local_value.i)  # 通过 thread.current_thread() 方法可以返回线程本身,然后就可以访问它的 name 属性。
    time.sleep(0.5)
#
def function_2():
    #for local_value.i in range(5):
    time.sleep(0.5)
    local_value.i = 1
    print(threading.current_thread().name, local_value.i)  # 通过 thread.current_thread() 方法可以返回线程本身,然后就可以访问它的 name 属性。
#
thread_1 = threading.Thread(target=function,name='子线程(1):') #建立子线
thread_1.start()#线程开始执行
thread_2 = threading.Thread(target=function_2,name='子线程(2):') #建立子线
thread_2.start()#线程开始执行
#
"""主线程"""
print('主线程的值: ', local_value.i)

结果如下:

子线程(1): 0
主线程的值:  2
子线程(2): 1

当我在建立子线程1后,在里面对local_value.i = 1进行赋值,然后延时0.5秒。在这期间在主线程调用local_value.i ,直接打印就会报错,报错告诉我local_value.i 还没有定义!!!

果断改变思路。使用网络socket通信进行数据传递
————————————————————————————————————————
见下一篇博客
、_、
2333333333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章