在python中,锁是否会阻止对整个数组/列表/dict的访问?

在python中,锁是否会阻止对整个数组/列表/dict的访问?,python,multithreading,locking,Python,Multithreading,Locking,我有4个线程,每个线程调用一个具有不同参数的公共函数。 但是所有4个线程都对同一个列表进行了更改。 他们可能正在访问列表中的同一索引/键,也可能没有。 我需要锁吗?我该怎么做 这是我的密码: import itertools from threading import Thread winr = {} two = {} winr=[{},{},{},{},{}] def openfile(): for i in range(0,5): filename='C:\Users

我有4个线程,每个线程调用一个具有不同参数的公共函数。 但是所有4个线程都对同一个列表进行了更改。 他们可能正在访问列表中的同一索引/键,也可能没有。 我需要锁吗?我该怎么做

这是我的密码:

import itertools
from threading import Thread
winr = {}
two = {}
winr=[{},{},{},{},{}]
def openfile():
    for i in range(0,5):
        filename='C:\Users\Rishabh\Desktop\\'+str(i+1)+'.txt'
        with open(filename) as f:
            lines = f.readlines()
        for x in lines:
            xt=x.split(" ")
            winr[i][str(xt[0])]=[str(xt[1]),str(xt[2])]

def getmatch(start,thread_id,last_match):
    match_id=start*4+thread_id
    while match_id<last_match:
        while True:
            try:
                import urllib2,json
                response = urllib2.urlopen('https://api.steampowered.com/IDOTA2Match_570/GetMatchDetails/V001/?match_id='+str(match_id)+'&key=C4B5D001E352AB612DCECABBFAB949B1')
            except urllib2.HTTPError, err:
                continue
            break
        r=[]
        d=[]
        team={}
        html = response.read()
        dic = json.loads(html)
        if 'result' in dic and 'radiant_win' in dic['result'] and dic['result']['human_players']==10:
            print match_id
            for a in dic['result']['players']:
                if a['player_slot']>127:
                    d.append(str(a['hero_id']))
                else:
                    r.append(str(a['hero_id']))
            if dic['result']['radiant_win']=='true':
                team[0]=r
                team[1]=d
            else:
                team[0]=d
                team[1]=r
            updatearrays(team)
        else:
            print "error",match_id
        match_id=match_id+4
                # do stuff

def updatearrays(team):
    team[0].sort()
    team[1].sort()
    winner=[]
    loser=[]
    for i in range(1,6):
        w=[]
        r=[]
        winner=list(itertools.combinations(team[0],i))
        loser=list(itertools.combinations(team[1],i))
        for d in winner:
            w.append('.'.join(str(a) for a in d))
        for d in loser:
            r.append('.'.join(str(a) for a in d))
        for k in w:
            if k in winr[i-1]:
                winr[i-1][k][0]=int(winr[i-1][k][0])+1
                winr[i-1][k][1]=int(winr[i-1][k][1])+1
            else:
                winr[i-1][k]=[1,1]
        for k in r:
            if k in winr[i-1]:
                winr[i-1][k][0]=int(winr[i-1][k][0])+1
            else:
                winr[i-1][k]=[1,0]
        winner=[]
        loser=[]

def updatefile():
   # print winr
    for i in range(0,5):
        filename='C:\Users\Rishabh\Desktop\\'+str(i+1)+'.txt'
        with open(filename,"w") as f:
            for j in winr[i]:
                tstring = str(j)+" "+str(winr[i][j][0])+" "+str(winr[i][j][1])+" \n"
                f.write(tstring)

openfile()
t1 = Thread(target=getmatch, args=(0,1,1000))
t2 = Thread(target=getmatch, args=(0,2,1000))
t3 = Thread(target=getmatch, args=(0,3,1000))
t4 = Thread(target=getmatch, args=(0,4,1000))
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
updatefile()
导入itertools
从线程导入线程
winr={}
二={}
winr=[{},{},{},{},{},{}]
def openfile():
对于范围(0,5)内的i:
filename='C:\Users\Rishabh\Desktop\\'+str(i+1)+'.txt'
打开(文件名)为f时:
行=f.读行()
对于直线中的x:
xt=x.split(“”)
winr[i][str(xt[0])]=[str(xt[1]),str(xt[2])]
def getmatch(开始、线程id、最后一次匹配):
匹配\u id=开始*4+线程\u id
而匹配_id127时:
d、 附加(str(一个['hero_id']))
其他:
r、 附加(str(一个['hero_id']))
如果dic['result']['radiant_win']=='true':
团队[0]=r
团队[1]=d
其他:
团队[0]=d
团队[1]=r
更新日期(团队)
其他:
打印“错误”,匹配\u id
匹配id=匹配id+4
#做事
def updatearrays(团队):
团队[0]。排序()
团队[1]。排序()
获胜者=[]
失败者=[]
对于范围(1,6)内的i:
w=[]
r=[]
获胜者=列表(itertools.compositions(团队[0],i))
失败者=列表(itertools.compositions(团队[1],i))
获奖者中的d:
w、 附加('.'.join(str(a)表示d中的a))
对于失败者中的d:
r、 附加('.'.join(str(a)表示d中的a))
对于w中的k:
如果winr[i-1]中的k:
winr[i-1][k][0]=int(winr[i-1][k][0])+1
winr[i-1][k][1]=int(winr[i-1][k][1])+1
其他:
winr[i-1][k]=[1,1]
对于r中的k:
如果winr[i-1]中的k:
winr[i-1][k][0]=int(winr[i-1][k][0])+1
其他:
winr[i-1][k]=[1,0]
获胜者=[]
失败者=[]
def updatefile():
#打印winr
对于范围(0,5)内的i:
filename='C:\Users\Rishabh\Desktop\\'+str(i+1)+'.txt'
打开(文件名为“w”)作为f:
对于winr[i]中的j:
tstring=str(j)+“”+str(winr[i][j][0])+“”+str(winr[i][j][1])+“\n”
f、 写入(tstring)
openfile()
t1=线程(目标=getmatch,args=(0,11000))
t2=线程(目标=getmatch,args=(0,21000))
t3=线程(目标=getmatch,参数=(0,31000))
t4=线程(目标=getmatch,args=(0,41000))
t1.start()
t2.start()
t3.start()
t4.开始()
t1.join()
t2.join()
t3.join()
t4.加入()
updatefile()

我提到的常用函数是updatearray()

尝试向我们展示你的意思(读取)的代码,因为不清楚这四个线程是如何访问同一个列表的。@boardrider我刚刚添加了代码,你能看一下吗?为什么
winr
定义了两次?@boardrider否!那是我的错误。我忘记删除初始定义。请创建并显示一个最小文件,而不是您引用的“C:\\Users\\Rishabh\\Desktop\\1.txt”。看见