欢迎访问www.allbetgaming.com!

首页科技正文

allbet官网娱乐平台开户:多线程下的list

admin2020-07-0344

前言

listPython 常用的几个基本数据类型之一.正常情形下我们会对 list 有增删改查的操作,显然易见不会有任何问题.那么若是我们试着在多线程下操作list 会有问题吗?

多线程下的 list

平安 or 不平安? 不平安!

通常我们说的线程平安是指针对某个数据结构的所有操作都是线程平安,在这种界说下,Python 常用的数据结构 list,dict,str 等都是线程不平安的

只管多线程下的 list 是线程不平安的,然则在 append 的操作下是它又是线程平安的.

若何判断线程平安呢?

对于线程平安不平安,我们可以通过极端条件下去复现,从而得出结论。比如说判断 list 是否线程平安

import threading
import time

# 随意设置 count 的值,值越大错误抛出的越快
count = 1000
l = []

def add():
    for i in range(count):
        l.append(i)
        time.sleep(0.0001)

def remove():

    for i in range(count):
        l.remove(i)
        time.sleep(0.0001)


t1 = threading.Thread(target=add)
t2 = threading.Thread(target=remove)
t1.start()
t2.start()
t1.join()
t2.join()
print(l)

有时刻一次运行并不一定就会失足,多次重试之后会泛起类似下面的错误

很显然这种操作方式不具有普适性,若是要是欧气太强,说不定会一直不泛起异常。

那么出了这种方式,有没有比较简单有用的方式吗?谜底是有的

dis

dis 库是 Python 自带的一个库,可以用来剖析字节码。这里我们需要有这样的熟悉,字节码的每一行都是一个原子操作,多线程切换就是以原子操作为单元的,若是一个操作需要两行字节码就说明它是线程不平安的

remove

这里我们先看一下上面 listremove 操作

>>> import dis
>>> def test_remove():
...     a = [1]
...     a.remove(0)
... 
>>> dis.dis(test_remove)
  2           0 LOAD_CONST               1 (1)
              2 BUILD_LIST               1
              4 STORE_FAST               0 (a)

  3           6 LOAD_FAST                0 (a)
              8 LOAD_ATTR                0 (remove)
             10 LOAD_CONST               2 (0)
             12 CALL_FUNCTION            1
             14 POP_TOP
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

从上面不难看出,整个 remove 操作被分成了好几条指令,这就意味着在多线程情形下会泛起庞杂的情形,试想一下,若是多线程下都去 remove 列表的话,并且不根据顺序,很容易泛起问题。

append

在最上面我们说到,listappend 操作是线程平安的,那么究竟是为什么呢?我们同样来用 dis 查看一下

8          19 LOAD_GLOBAL              0 (a)
           22 LOAD_ATTR                2 (append)
           25 LOAD_CONST               2 (1)
           28 CALL_FUNCTION            1
           31 POP_TOP    

这里显然,append 也是有几条指令,势必在多线程执行的情形下也会发生交织,然则对于多线程下我们操作 append, 我们一定也不会在乎这个时刻 list 到顺序问题了,以是我们说它的 append 是线程平安的

参考

https://stackoverflow.com/questions/6319207/are-lists-thread-safe/19728536#19728536

https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe

,

Allbet客户端下载

欢迎进入Allbet客户端下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

本文链接:https://www.lphggs.com/post/958.html

网友评论

最新评论

  • UG环球客户端 10/11 说:

    Allbet Gmaing开户欢迎进入Allbet Gmaing开户(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。连老妈都迷上了

  • 环球UGAPP下载 10/11 说:

    Allbet Gmaing欢迎进入欧博Allbet官网(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。内容过于优秀

  • 环球UG官网开户网址 10/11 说:

    www.allbetgaming.com欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。粉丝大军助威

  • UG环球网址 10/11 说:

    Allbet Gmaing官网欢迎进入Allbet Gmaing官网(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。放假了使劲看

  • Allbet登录网址 10/10 说:

    AllbetGmaing下载欢迎进入AllbetGmaing下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。当代冰心

  • 环球UG官方注册 10/09 说:

    欧博亚洲客户端欢迎进入欧博亚洲客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。无意刷到,厉害了

  • Allbet官网 10/08 说:

    www.allbetgaming.com欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。字字珠玑

  • Allbet官网 10/08 说:

    www.allbetgaming.com欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。字字珠玑