我在这里搜索了有关如何在python中进行线程化的信息,但到目前为止,我还没有得到我需要的答案。我对Queue和Threading
python类不是很熟悉,因此,这里给出的一些答案对我来说毫无意义。
我想创建一个线程池,我可以给它执行不同的任务,当所有线程都结束时,获取结果值并处理它们。到目前为止,我已尝试执行此操作,但无法获得结果。我写的代码是:
from threading import Thread
from Queue import Queue
class Worker(Thread):
"""Thread executing tasks from a given tasks queue"""
def __init__(self, tasks):
Thread.__init__(self)
self.tasks = tasks
self.daemon = True
self.result = None
self.start()
def run(self):
while True:
func, args, kargs = self.tasks.get()
try:
self.result = func(*args, **kargs)
except Exception, e:
print e
self.tasks.task_done()
def get_result(self):
return self.result
class ThreadPool:
"""Pool of threads consuming tasks from a queue"""
def __init__(self, num_threads):
self.tasks = Queue(num_threads)
self.results = []
for _ in range(num_threads):
w = Worker(self.tasks)
self.results.append(w.get_result())
def add_task(self, func, *args, **kargs):
"""Add a task to the queue"""
self.tasks.put((func, args, kargs))
def wait_completion(self):
"""Wait for completion of all the tasks in the queue"""
self.tasks.join()
def get_results(self):
return self.results
def foo(word, number):
print word*number
return number
words = ['hello', 'world', 'test', 'word', 'another test']
numbers = [1,2,3,4,5]
pool = ThreadPool(5)
for i in range(0, len(words)):
pool.add_task(foo, words[i], numbers[i])
pool.wait_completion()
results = pool.get_results()
print results
输出将给定字数的字符串打印给定字数乘以给定数,但结果列表中没有值,因此我应该将func的返回值放在这里。
或简单的方法是创建一个列表,在其中填充队列并添加字典或某个变量以将结果存储为函数的参数,然后将任务添加到队列后,将此结果参数添加到结果列表中:
def foo(word, number, r):
print word*number
r[(word,number)] = number
return number
words = ['hello', 'world', 'test', 'word', 'another test']
numbers = [1,2,3,4,5]
pool = ThreadPool(5)
results = []
for i in range(0, len(words)):
r = {}
pool.add_task(foo, words[i], numbers[i], r)
results.append(r)
print results
Python实际上有一个可以使用的内置线程池,只是没有充分说明:
from multiprocessing.pool import ThreadPool
def foo(word, number):
print (word * number)
r[(word,number)] = number
return number
words = ['hello', 'world', 'test', 'word', 'another test']
numbers = [1,2,3,4,5]
pool = ThreadPool(5)
results = []
for i in range(0, len(words)):
results.append(pool.apply_async(foo, args=(words[i], numbers[i])))
pool.close()
pool.join()
results = [r.get() for r in results]
print results
或(使用map
代替apply_async
):
from multiprocessing.pool import ThreadPool
def foo(word, number):
print word*number
return number
def starfoo(args):
"""
We need this because map only supports calling functions with one arg.
We need to pass two args, so we use this little wrapper function to
expand a zipped list of all our arguments.
"""
return foo(*args)
words = ['hello', 'world', 'test', 'word', 'another test']
numbers = [1,2,3,4,5]
pool = ThreadPool(5)
# We need to zip together the two lists because map only supports calling functions
# with one argument. In Python 3.3+, you can use starmap instead.
results = pool.map(starfoo, zip(words, numbers))
print results
pool.close()
pool.join()
问题内容: 我有一个固定的线程池,我可以将任务提交给该线程池(限制为 5个 线程)。如何找出这 5个 线程中的哪一个执行我的任务(例如“第3 个 线程中的第3 个 线程正在执行此任务”)? 问题答案: 使用:
问题内容: 下面的函数返回一个字符串。我如何获取从线程目标返回的值? 上面显示的“一种显而易见的方法”不起作用:。 问题答案: 我见过的一种方法是将可变对象(例如列表或字典)与索引或某种其他标识符一起传递给线程的构造函数。然后,线程可以将其结果存储在该对象的专用插槽中。例如: 如果你确实想join()返回被调用函数的返回值,则可以使用如下所示的Thread子类来实现: 由于名称修改,这有点麻烦,并
问题内容: 我有一个多线程Python程序和一个实用程序函数,该函数写出时间戳记和消息。不幸的是,结果日志文件没有给出哪个线程正在生成哪个消息的指示。 我希望能够在消息中添加一些内容,以标识哪个线程正在调用它。显然,我可以使线程将这些信息传递进去,但这将需要更多的工作。是否有一些我可以使用的等效线程? 问题答案: ,或者(或对于Python <2.6)。
本文向大家介绍在C#中如何从线程中获取线程ID,包括了在C#中如何从线程中获取线程ID的使用技巧和注意事项,需要的朋友参考一下 线程被定义为程序的执行路径。每个线程定义唯一的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程(每个线程执行一个特定的工作)通常会很有帮助。 线程是轻量级进程。使用线程的一个常见示例是现代操作系统对并发编程的实现。使用线程可以节省CPU周期,并提
问题内容: 我在Java中使用A 来管理许多正在运行的线程。我创建了自己的简单名称,以便为线程命名。 问题在于,在首次创建线程池时会在线程中设置名称,并且该名称与线程池实际正在运行的任务无关。我了解这一点…尽管我的Runnable和Callables具有名称,但它们实际上是从的运行线程开始的抽象层。 关于为线程池创建名称,StackOverflow上还有其他一些问题。(请参阅如何为可调用线程命名?
本文向大家介绍详解python中的线程与线程池,包括了详解python中的线程与线程池的使用技巧和注意事项,需要的朋友参考一下 线程 进程和线程 什么是进程? 进程就是正在运行的程序, 一个任务就是一个进程, 进程的主要工作是管理资源, 而不是实现功能 什么是线程? 线程的主要工作是去实现功能, 比如执行计算. 线程和进程的关系就像员工与老板的关系, 老板(进程) 提供资源 和 工作空间, 员工(
问题内容: 我有一个使用该框架的Java应用程序,并且我的代码看起来像这样 我的理解是,JVM会在内部创建5个线程的池。现在,当我在探查器中检查执行情况时,会得到类似的信息。 , 我需要一种方法来区分由我创建的和由服务器创建的 。 我在想,如果我可以命名线程池,它应该可以解决问题,但是看不到任何允许我执行此操作的API。 提前致谢。 问题答案: 您可以将自己的ThreadFactory传递给Sch
问题内容: 如何查看Java进程中的线程数? 问题答案: 调试Java程序的有用工具,它提供了线程数和其他有关线程的信息: