将列表传递给线程
Passing a list to a thread
我正在尝试在 python 上启动一个线程,该线程需要处理来自服务器的更新。
然后我尝试使用双向流通过 GRPC 在我拥有的服务上发送上述数据。
所以想法是,当事件到达时,线程会将新事件推送到数组中。通过这种方式,使用迭代器,GRPC 服务将看到一些东西被推入了数组,并且它将在双向流上流式传输它。
为了实现这个目标,我需要将数组作为参数传递给将由新线程处理的函数。
这是代码:
thread = Thread(target=handler_subscriptions , args= {address, endpoint , path1 ,event_array})
event_array 是我需要传递的数组。
我收到此运行时错误:
TypeError: unhashable type: 'list'
谁能解释一下为什么,以及如何绕过这个问题?
这与线程无关,您正在尝试创建一个包含可变类型(列表)的集合。您可以通过两种方式解决此问题。
此解决方案可以将不按顺序传递给在目标中调用的函数的参数。仅当您只有一个参数时才使用它。
第二个更好。
您可以使用元组而不是列表(元组是不可变的,因此是可散列的):
thread = Thread(target=handler_subscriptions, args= {address, endpoint, path1, tuple(event_array}))
或者你不能使用一套。 documentation 推荐使用元组而不是集合:
thread = Thread(target=handler_subscriptions, args= (address, endpoint, path1, event_array))
Thread
的 args
参数包含 target
可调用对象的位置参数。因此,它需要是一个 ordered 集合。您不能使用集合,因为参数的使用顺序没有保证。
改用元组:
thread = Thread(target=handler_subscriptions, args=(address, endpoint, path1, event_array))
尽管列表也可以。
您看到的错误消息的确切原因是您尝试设置的元素之一不是可哈希类型。这是偶然的,因为它引发了一个异常,导致您解决了这个问题(因为集合的元素必须是可散列的),但是将它更改为可散列类型并不是这里的解决方案,尽管它可能会在某些方面起作用如果碰巧集合中的元素按插入顺序出现的时间。
我正在尝试在 python 上启动一个线程,该线程需要处理来自服务器的更新。
然后我尝试使用双向流通过 GRPC 在我拥有的服务上发送上述数据。
所以想法是,当事件到达时,线程会将新事件推送到数组中。通过这种方式,使用迭代器,GRPC 服务将看到一些东西被推入了数组,并且它将在双向流上流式传输它。
为了实现这个目标,我需要将数组作为参数传递给将由新线程处理的函数。
这是代码:
thread = Thread(target=handler_subscriptions , args= {address, endpoint , path1 ,event_array})
event_array 是我需要传递的数组。 我收到此运行时错误:
TypeError: unhashable type: 'list'
谁能解释一下为什么,以及如何绕过这个问题?
这与线程无关,您正在尝试创建一个包含可变类型(列表)的集合。您可以通过两种方式解决此问题。
此解决方案可以将不按顺序传递给在目标中调用的函数的参数。仅当您只有一个参数时才使用它。 第二个更好。 您可以使用元组而不是列表(元组是不可变的,因此是可散列的):
thread = Thread(target=handler_subscriptions, args= {address, endpoint, path1, tuple(event_array}))
或者你不能使用一套。 documentation 推荐使用元组而不是集合:
thread = Thread(target=handler_subscriptions, args= (address, endpoint, path1, event_array))
Thread
的 args
参数包含 target
可调用对象的位置参数。因此,它需要是一个 ordered 集合。您不能使用集合,因为参数的使用顺序没有保证。
改用元组:
thread = Thread(target=handler_subscriptions, args=(address, endpoint, path1, event_array))
尽管列表也可以。
您看到的错误消息的确切原因是您尝试设置的元素之一不是可哈希类型。这是偶然的,因为它引发了一个异常,导致您解决了这个问题(因为集合的元素必须是可散列的),但是将它更改为可散列类型并不是这里的解决方案,尽管它可能会在某些方面起作用如果碰巧集合中的元素按插入顺序出现的时间。