gpt4 book ai didi

python - 如何修改线程内的列表?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:43 26 4
gpt4 key购买 nike

我需要通过在线程末尾添加一些元素来修改 list

这是我的代码:

def go():
while queueCommand.qsize() > 0:
command = queueCommand.get(False)
res = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
output = res.communicate()
output = str(output)
star = output.find("address") + 8
en = output.find(",")
ip = output[star:en-3]
alist.append(ip) #<================== her i use the liste

if __name__ == '__main__':
with open ("icq.txt","r") as myfile:
text = myfile.read()
end = 0
alist = []
queueCommand = Queue.Queue()
while True:
start = text.find("href=") + 13
if start == 12:
break
end = text.find("/",start)
if text[start:end].find("icq.com") != -1:
hostname="host "+ text[start:end]
queueCommand.put(hostname)
text = text[end:len(text)]

for i in range(10):
threading.Thread(target=go,args=(alist)).start() #<====== i give the list as argument

print alist

最后的打印语句显示一个空列表,[]。有什么想法吗?

最佳答案

你有几个问题。

  1. 您将 alist 指定为 args,但您需要将其作为元组传递,这看起来就像您尝试做的那样,但是单项元组看起来像这样 (列表,)。现在您只是在使用全局 alist,这可能不是您想要的。

  2. 您的 go 方法不需要参数(即列表)。

  3. 为了线程安全,我相信您需要使用某种信号量/互斥/锁原语。 threading 模块附带一个 Lock 实现,您可以使用它在追加操作期间限制对 alist 的访问。

  4. 最重要的是,您无需等待线程完成即可打印结果。要等待线程完成,您需要在线程上调用 .join()

我可能会选择使用另一个队列实例来放入结果,然后您可以从队列中读取所有内容以在线程完成后构建您的列表。

这是您的代码的更新版本(有效)。就像我说的,我可能会选择使用 Queue,而且自从我切换到 eventlet/gevent 之后,我就没有太多地使用线程模块……所以可能有一些方法可以改进我提供的东西。

import threading
import Queue
import subprocess

lock = threading.Lock()

def go(alist):
while queueCommand.qsize() > 0:
command = queueCommand.get(False)
res = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
output = res.communicate()
output = str(output)
star = output.find("address") + 8
en = output.find(",")
ip = output[star:en-3]
lock.acquire()
alist.append(ip) #<================== her i use the liste
lock.release()

def foo(alist):
alist.append("bar")

if __name__ == '__main__':
with open ("icq.txt","r") as myfile:
text = myfile.read()
end = 0
alist = []
queueCommand = Queue.Queue()
while True:
start = text.find("href=") + 13
if start == 12:
break
end = text.find("/",start)
if text[start:end].find("icq.com") != -1:
hostname="host "+ text[start:end]
queueCommand.put(hostname)
text = text[end:len(text)]

threads = []
for i in range(10):
thread = threading.Thread(target=go,args=(alist,)) #<====== i give the list as argument)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()

print alist

关于python - 如何修改线程内的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com