Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 队列线程状态进度_Python_Multithreading_Queue - Fatal编程技术网

Python 队列线程状态进度

Python 队列线程状态进度,python,multithreading,queue,Python,Multithreading,Queue,我正在尝试创建一个web提取器,我有多线程代码,我需要打印扫描仪的状态/进度: 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 WorkerThrea

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

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)
但它不工作,我如何打印状态/进度?

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

但是,他们有一种方法可以为您提供大致的大小,正是为了这种目的


如果您想要精确的值,则需要第二个
队列
,其中每个任务都将某些内容放入输出队列中,一些额外的线程(或者可能是主线程)在其上循环,并统计到目前为止完成的任务。或者,也可以使用更简单的方法,例如全局
int
计数器和全局
锁来保护它


然而,我认为从池或执行者的角度写这篇文章要简单得多。这将负责为您的任务排队,并将每个任务的值返回给主线程,而无需管理任何内容。例如,使用Python3.x模块2.x的后端口,下面是您的整个程序,并添加了进度:

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!"

你能解释一下为什么<代码> LeN(队列)不正确吗?@以色列:<代码>队列 S没有长度,所以你可以根据你的Python版本得到<代码> TypeError <代码>或<代码>属性错误< /Cord>,并且大概他认为没有正确的方法来获得进度条的信息…