在python中,锁是否会阻止对整个数组/列表/dict的访问?
我有4个线程,每个线程调用一个具有不同参数的公共函数。 但是所有4个线程都对同一个列表进行了更改。 他们可能正在访问列表中的同一索引/键,也可能没有。 我需要锁吗?我该怎么做 这是我的密码:在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
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”。看见