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
Multithreading Python';让我们试试吧——只是没有按预期工作_Multithreading_Python 3.x_Exception - Fatal编程技术网

Multithreading Python';让我们试试吧——只是没有按预期工作

Multithreading Python';让我们试试吧——只是没有按预期工作,multithreading,python-3.x,exception,Multithreading,Python 3.x,Exception,我在理解Python中异常是如何工作的方面遇到了一些困难 在下面的代码中,someClass被初始化,并调用run\u engine()方法。 run\u engine()方法生成各种线程,其中一个线程是“数据源”线程。数据源线程在数据库中查询一组特定的数据,数据库将依次开始对查询的数据集进行流式传输(subpub机制)。当completedata集被传输到我的Python应用程序时,数据库将关闭与数据源线程的连接,以指示流已经结束,并且可能发生其他操作。问题就从这里开始 在下面的\u fetc

我在理解Python中异常是如何工作的方面遇到了一些困难

在下面的代码中,
someClass
被初始化,并调用
run\u engine()
方法。
run\u engine()
方法生成各种线程,其中一个线程是“数据源”线程。数据源线程在数据库中查询一组特定的数据,数据库将依次开始对查询的数据集进行流式传输(subpub机制)。当completedata集被传输到我的Python应用程序时,数据库将关闭与数据源线程的连接,以指示流已经结束,并且可能发生其他操作。问题就从这里开始

在下面的
\u fetch_data()
方法中,我正在捕获
QReaderException
(在db断开连接时引发的一个异常)并引发一个自定义异常(
ServiceExitException
),以便在主线程中执行一些最终操作

出于某种原因,它会打印两个异常的stacktrace(因此
QReaderException
似乎被捕获,但不会悄悄地通过

为什么会发生这种情况?这与我的应用程序的线程性质有关吗

谢谢

# This method belongs to the data source thread
def _fetch_data(self):
    while not self.stopped():
        try:
            message = self.connections[self.port].receive(data_only=False, raw=False)  # retrieve entire message
            if message.type != MessageType.ASYNC:
                raise UnexpectedMessageTypeException('Unexpected message, expected message of type: ASYNC')
            if isinstance(message.data, list):
                return message

        except (QReaderException, UnexpectedMessageTypeException) as e:
            # this block seems to be executed
            raise ServiceExitException()


if __name__ == '__main__':
    someClass = SomeClass()

    try:
        someClass.run_engine()
        while True:
            time.sleep(0.5)

    except ServiceExitException as e:
        someClass.stop_engine()
        someClass.join()
        someClass.store_data()
        sys.exit(0)

在这两者之间应该有一条线,比如

在处理上述异常期间,发生了另一个异常:

可以说,Python在except块结束之前不会将第一个异常视为已处理。因此,它们都被视为未处理,并且回溯被合并为一个

如果你使用

raise ServiceExitException() from e
然后,回溯之间的消息变为

上述异常是以下异常的直接原因:

不过,这样的异常重定向已经足够了。我想最简单的方法就是去掉自定义的
ServiceExitException
,只剩下
主代码中的所有内容。或者更好的方法是,使用
try:…finally:…
构造,这样可以避免诸如告诉我你不应该做除s以外的所有捕捉