python 中 list 是否是线程安全的?

版权声明:本文为博主原创文章,未经博主允许不得转载。~~~~ https://blog.csdn.net/qq_29719097/article/details/88652521

 是不是不共享数据就不会发生线程不安全?

线程安全就是多线程访问时,采取了加锁的机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问知道该线程读取完,其他的线程才可使用,不会出现数据不一致或数据污染的问题

线程不安全就是不提供数据访问保护,有可能出现多个线程现后更改数据造成所得到的数据是脏数据。

总的来说,只要线程之间没有共享资源,那么就是线程安全的,有共享资源,为了保证线程安全,需要引进锁的机制。

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的话,可不好找,,,,,

这个问题也就这样吧,,,,

猜你喜欢

转载自blog.csdn.net/qq_29719097/article/details/88652521
今日推荐