是不是不共享数据就不会发生线程不安全?
线程安全就是多线程访问时,采取了加锁的机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问知道该线程读取完,其他的线程才可使用,不会出现数据不一致或数据污染的问题
线程不安全就是不提供数据访问保护,有可能出现多个线程现后更改数据造成所得到的数据是脏数据。
总的来说,只要线程之间没有共享资源,那么就是线程安全的,有共享资源,为了保证线程安全,需要引进锁的机制。
lis = list(range(10000))
print(lis)
print(len(lis))
from share_var import gloable
import threading
def consume():
for i in gloable.lis:
with open('aab.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
if __name__ == '__main__':
from threading import Thread
t1 = Thread(target=consume, name='t1')
t2 = Thread(target=consume, name='t2')
t3 = Thread(target=consume, name='t3')
t4 = Thread(target=consume, name='t4')
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
from share_var.gloable import lis
import threading
def consume():
for i in lis:
with open('aabc.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
if __name__ == '__main__':
from threading import Thread
t1 = Thread(target=consume, name='t1')
t2 = Thread(target=consume, name='t2')
t3 = Thread(target=consume, name='t3')
t4 = Thread(target=consume, name='t4')
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
以上代码的区别就是在引入全局变量的时候 在引入包 和引入变量的区别
执行的效果呢,
-rw-r--r-- 1 lishulong 197121 355506 Mar 18 23:07 aab.txt
-rw-r--r-- 1 lishulong 197121 355537 Mar 18 23:07 aabc.txt
发现结构不相同;
aab.txt
aabc.txt
环境:
$ python -V
Python 3.6.2rc1
得出对于共享的全局 lis 是不安全的在不同的线程中??
import threading
def consume():
k = list(range(10000))
for i in k:
with open('a.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
if __name__ == '__main__':
from threading import Thread
t1 = Thread(target=consume, name='t1')
t2 = Thread(target=consume, name='t2')
t3 = Thread(target=consume, name='t3')
t4 = Thread(target=consume, name='t4')
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
import threading
def consume4():
k = list(range(10000))
for i in k:
with open('a.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
def consume3():
k = list(range(10000))
for i in k:
with open('a.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
def consume1():
k = list(range(10000))
for i in k:
with open('a.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
def consume():
k = list(range(10000))
for i in k:
with open('a.txt', 'a+') as file:
file.write('{},{}\n'.format(i, threading.current_thread().name))
if __name__ == '__main__':
from threading import Thread
t1 = Thread(target=consume, name='t1')
t2 = Thread(target=consume1, name='t2')
t3 = Thread(target=consume3, name='t3')
t4 = Thread(target=consume4, name='t4')
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
单线程跑 ok。
只要是多线程,即使不共享也会出现问题,是gil的问题吗
dist的话,可不好找,,,,,
这个问题也就这样吧,,,,