为什么ThreadPool中的线程不能异步运行?

纳瓦兹

我编写了以下概念验证代码:

import time
from multiprocessing.pool import ThreadPool

class Maybe:
    def __init__(self):
        self._value = None
        self._exists = False
    def exists(self):
        return self._exists
    def value(self):
        if not self.exists():
            raise ValueError("Maybe doesn't hold any value")
        return self._value
    def set(self, value):
        self._value = value
        self._exists = True
    def unset(self):
        self._value = None
        self._exists = False

class Future(object):

    def __init__(self):
        self._holder = Maybe()
        self._handler = None

    def _set(self, value):
        self._holder.set(value)
        self._invoke()

    def _invoke(self):
        if self._handler and self._holder.exists():
            self._handler(self._holder.value())

    def then(self, handler):
        self._handler = handler
        self._invoke()


def fib(count):
    f,s = 0,1
    for i in xrange(count):
        f,s =s,f+s
    return s

pool = ThreadPool(5)

def test(fun, arg):
    def print_fib(x):
        print("fib => {0}, {1}\n".format(arg, len(str(x))))
    tb = time.time()
    future = Future()
    future.then(print_fib)
    future._async_result = pool.apply_async(fun, [arg], callback=future._set)
    ta = time.time()
    print ("Time elapsed : {0}".format(ta - tb))
    return future


x1=test(fib, 2029)
x2=test(fib, 989999)
x3=test(fib, 103)
x4=test(fib, 38484)
x5=test(fib, 20)

time.sleep(3)

我希望所有的调用都能异步运行。但是它们似乎并不异步运行。例如,带103参数的调用应该在带参数的调用之前完成989999我看不到这种情况。如果我对第二个调用使用更大的参数,则即使是第一个调用也要花费更多时间。

有人可以解释发生了什么吗?为什么它们不异步运行?

怪异的

问题是ThreadPool将所有线程设置为守护程序,即,如果主线程退出,则所有线程将被终止。time.sleep(3)这不足以使您的流程完成其任务,这就是原因。请注意,您的“经过时间”日志不正确,因为它测量的是触发线程所需的时间,而不是实际任务。

您应该始终.join线程化。通过ThreadPool以下代码,您可以做到这一点:

...

x1=test(fib, 2029)
x2=test(fib, 989999)
x3=test(fib, 103)
x4=test(fib, 38484)
x5=test(fib, 20)

pool.close()
pool.join()

同时将所有日志移到print_fib功能上,它应能按预期工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么线程不能连续运行?

来自分类Dev

为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

来自分类Dev

为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

来自分类Dev

为什么异步代码在C#中的工作线程上运行

来自分类Dev

为什么我的Rust线程不能并行运行?

来自分类Dev

为什么这些线程ActiveRecord查询不能同时运行?

来自分类Dev

为什么这些线程ActiveRecord查询不能并发运行?

来自分类Dev

为什么 C# 线程不能在多核上运行?

来自分类Dev

为什么任务在主线程中运行?

来自分类Dev

MVC中的异步/等待-为什么在长时间运行的操作中释放线程很重要

来自分类Dev

为什么异步线程中的“ Isolate :: GerCurrent()”为空?

来自分类Dev

为什么我不能在异步方法中调试代码?

来自分类Dev

意图在android中是异步的。为什么不能同步呼叫?

来自分类Dev

为什么我不能从异步代码中捕获异常?

来自分类Dev

为什么在ExecutorService中不能中断线程?

来自分类Dev

为什么异步/等待不异步运行?

来自分类Dev

当异步事件循环运行时,为什么不能捕获SIGINT?

来自分类Dev

为什么“ Hello World”插件在Chrome中不能运行,而在Firefox中却不能运行?

来自分类Dev

为什么Dockerfile中的cron服务不能运行?

来自分类Dev

为什么我不能在netlify中运行此脚本?

来自分类Dev

为什么rep函数中的times参数不能正确运行

来自分类Dev

为什么在终端中运行的Emacs不能区分Ctrl +;从 ”;”?

来自分类Dev

为什么我的功能规格不能在RSpec中运行?

来自分类Dev

为什么这不能在恒定内存中运行?

来自分类Dev

为什么我不能在 Swift 中自己运行命令?

来自分类Dev

为什么这个命令不能在 cron 中运行?

来自分类Dev

为什么这个交换程序不能在 C 中运行?

来自分类Dev

为什么代码不能在 Chrome 扩展中运行?

来自分类Dev

当 RecyclerView 滚动时从 ThreadPool 中杀死正在运行的线程

Related 相关文章

  1. 1

    为什么线程不能连续运行?

  2. 2

    为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

  3. 3

    为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

  4. 4

    为什么异步代码在C#中的工作线程上运行

  5. 5

    为什么我的Rust线程不能并行运行?

  6. 6

    为什么这些线程ActiveRecord查询不能同时运行?

  7. 7

    为什么这些线程ActiveRecord查询不能并发运行?

  8. 8

    为什么 C# 线程不能在多核上运行?

  9. 9

    为什么任务在主线程中运行?

  10. 10

    MVC中的异步/等待-为什么在长时间运行的操作中释放线程很重要

  11. 11

    为什么异步线程中的“ Isolate :: GerCurrent()”为空?

  12. 12

    为什么我不能在异步方法中调试代码?

  13. 13

    意图在android中是异步的。为什么不能同步呼叫?

  14. 14

    为什么我不能从异步代码中捕获异常?

  15. 15

    为什么在ExecutorService中不能中断线程?

  16. 16

    为什么异步/等待不异步运行?

  17. 17

    当异步事件循环运行时,为什么不能捕获SIGINT?

  18. 18

    为什么“ Hello World”插件在Chrome中不能运行,而在Firefox中却不能运行?

  19. 19

    为什么Dockerfile中的cron服务不能运行?

  20. 20

    为什么我不能在netlify中运行此脚本?

  21. 21

    为什么rep函数中的times参数不能正确运行

  22. 22

    为什么在终端中运行的Emacs不能区分Ctrl +;从 ”;”?

  23. 23

    为什么我的功能规格不能在RSpec中运行?

  24. 24

    为什么这不能在恒定内存中运行?

  25. 25

    为什么我不能在 Swift 中自己运行命令?

  26. 26

    为什么这个命令不能在 cron 中运行?

  27. 27

    为什么这个交换程序不能在 C 中运行?

  28. 28

    为什么代码不能在 Chrome 扩展中运行?

  29. 29

    当 RecyclerView 滚动时从 ThreadPool 中杀死正在运行的线程

热门标签

归档