python - 如何在 Python3 中检测 concurrent.futures 中的异常?

标签 python python-2.7 multiprocessing python-3.4 concurrent.futures

由于它的并发 future 模块,我刚刚转向 python3。我想知道我是否可以让它检测错误。我想使用并发 future 来并行程序,如果有更高效的模块请告诉我。

我不喜欢多处理,因为它太复杂而且没有太多文档。但是,如果有人可以编写一个没有类的 Hello World,只有使用多处理并行计算的函数,这样它就很容易理解,那就太好了。

这是一个简单的脚本:

from concurrent.futures import ThreadPoolExecutor

def pri():
    print("Hello World!!!")

def start():
    try:
        while True:
            pri()
    except KeyBoardInterrupt:
        print("YOU PRESSED CTRL+C")


with ThreadPoolExecutor(max_workers=3) as exe:
    exe.submit(start)

上面的代码只是一个演示,说明 CTRL+C 如何无法打印语句。

我想要的是能够在出现错误时调用函数。此错误检测必须来自函数本身。

另一个例子

import socket
from concurrent.futures import ThreadPoolExecutor 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
def con():
    try:
        s.connect((x,y))
        main()
    except: socket.gaierror
         err()
def err():
    time.sleep(1)
    con()
def main():
    s.send("[+] Hello")
with ThreadPoolExecutor as exe:
    exe.submit(con)

最佳答案

聚会太晚了,但也许它会帮助其他人......

我很确定原来的问题没有得到真正的回答。人们对 user5327424 使用键盘中断引发异常这一事实感到困惑,而重点是未引发异常(无论它是如何引起的)。例如:

import concurrent.futures


def main():
    numbers = range(10)

    with concurrent.futures.ThreadPoolExecutor() as executor:
        results = {executor.submit(raise_my_exception, number): number for number in numbers}


def raise_my_exception(number):
    print('Proof that this function is getting called. %s' % number)
    raise Exception('This never sees the light of day...')


main()

执行上面的示例代码时,您会看到屏幕上显示打印语句中的文本,但您永远不会看到异常。这是因为每个线程的结果都保存在 results 对象中。您需要迭代该对象以获取异常。以下示例显示了如何访问结果。

import concurrent.futures


def main():
    numbers = range(10)

    with concurrent.futures.ThreadPoolExecutor() as executor:
        results = {executor.submit(raise_my_exception, number): number for number in numbers}

    for result in results:
        # This will cause the exception to be raised (but only the first one)
        print(result.result())


def raise_my_exception(number):
    print('Proof that this function is getting called. %s' % number)
    raise Exception('This will be raised once the results are iterated.')


main()

我不确定我是否喜欢这种行为,但它确实允许线程完全执行,而不管在单个线程中遇到的异常。

关于python - 如何在 Python3 中检测 concurrent.futures 中的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448329/

相关文章:

python - R 在 python 中具有函数

python - `as_completed`模块中的模拟 `multiprocessing`

python - 如何让多处理稍等一下?

python - 使类在同一实例中可调用

python - 查找回归平面并将其绘制到一组点

python - 将 alembic 与多个数据库一起使用

python - 让两个 Frames 各占可用宽度的 50%?

python - Peewee 抛出 KeyError : 'f'

python - swift 和 Python : identical code results in different results

python - MySQL并行选择请求(python)