首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >队列线程状态进展

队列线程状态进展
EN

Stack Overflow用户
提问于 2013-09-09 20:10:33
回答 1查看 3.1K关注 0票数 2

我正在尝试创建一个web提取器,我有这个多线程代码,我需要打印扫描仪的状态/进度:

代码语言:javascript
复制
import time
import threading
import Queue       
import sys

try:
    Lista = open(sys.argv[1], "r").readlines()
except(IOError): 
    print "Error: Check your ip list path\n"
    sys.exit(1)

class WorkerThread(threading.Thread) :

    def __init__(self, queue) :
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self) :
        while True :
            counter = self.queue.get()
            sys.stdout.write("line nr : \r")
            self.queue.task_done()      

queue = Queue.Queue()

for i in range(50) :
    worker = WorkerThread(queue)
    worker.setDaemon(True)
    worker.start()

for line in Lista:
    queue.put(line)

queue.join()

print "All task over!"

如何打印状态/进度,当扫描仪工作时,我尝试了len(queue),但它不能工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-09 20:14:39

Queue对象没有len,因为它们本质上是跨线程共享的,这将是不准确和误导的。

但是,它们有一个qsize方法,它为您提供了大致的大小,正是出于这种目的。

如果您想要确切的值,那么您需要第二个Queue,其中每个任务都将一些东西放到了外队列中,并且有一些额外的线程(或者可能是主线程)在它上循环,并计算到目前为止完成的任务。或者,也可以选择一些更简单的东西,比如具有全局int保护的全局Lock计数器。

然而,我认为用池或执行者来写这个要简单得多。这将负责为您排队处理任务,并将每个任务的值返回到主线程,而不需要管理任何内容。例如,使用futures (用于2.x的Python3.x concurrent.futures模块的后端),下面是整个程序,并添加了进度:

代码语言:javascript
复制
import sys
import futures 

try:
    Lista = open(sys.argv[1], "r").readlines()
except(IOError): 
    print "Error: Check your ip list path\n"
    sys.exit(1)

def task(line):
    # Do something

with futures.ThreadPoolExecutor(50) as executor:
    fs = [executor.submit(task, line) for line in Lista]
    for i, f in enumerate(futures.as_completed(fs)):
        sys.stdout.write("line nr: {} / {} \r".format(i, len(Lista)))

print "All task over!"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18706220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档