go 中context
python中collections 包
Go 中的 context
包
Go 的 context
包用于在 Goroutine 之间传递上下文信息,如取消信号、截止日期和请求范围的值。它主要用于处理超时、取消和传递请求范围的元数据。
示例:使用 context
处理超时
下面的示例展示了如何使用 context
包来处理超时操作。
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个上下文,并设置超时时间为 2 秒
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // 确保在 main 函数结束时取消上下文
// 启动一个 Goroutine,执行一些耗时操作
go func() {
// 模拟一个耗时操作,耗时 3 秒
select {
case <-time.After(3 * time.Second):
fmt.Println("Operation completed")
case <-ctx.Done():
fmt.Println("Operation timed out:", ctx.Err())
}
}()
// 等待 Goroutine 完成
time.Sleep(3 * time.Second)
}
在这个示例中,Goroutine 模拟了一个耗时操作。如果操作超过了 2 秒的超时时间,ctx.Done()
会被触发,打印超时信息。
Python 中的 collections
包
Python 的 collections
包提供了几个有用的集合数据类型,如 namedtuple
、deque
、Counter
、OrderedDict
和 defaultdict
。
示例:使用 defaultdict
defaultdict
是 dict
的一个子类,它提供了一个默认值工厂函数,可以在访问不存在的键时自动生成默认值。
from collections import defaultdict
# 创建一个 defaultdict,默认值为 0
dd = defaultdict(int)
# 访问不存在的键,会自动生成默认值 0
print(dd['a']) # 输出 0
# 对键 'a' 进行计数
dd['a'] += 1
print(dd['a']) # 输出 1
# 访问另一个不存在的键,会自动生成默认值 0
print(dd['b']) # 输出 0
# 对键 'b' 进行计数
dd['b'] += 2
print(dd['b']) # 输出 2
在这个示例中,defaultdict
的默认值工厂函数是 int
,所以访问不存在的键时会返回默认值 0
。
示例:使用 Counter
Counter
是一个用于计数的容器,它可以统计可迭代对象中元素的频率。
from collections import Counter
# 创建一个 Counter 对象
c = Counter(['a', 'b', 'c', 'a', 'b', 'a'])
# 输出元素的计数
print(c) # 输出 Counter({'a': 3, 'b': 2, 'c': 1})
# 获取某个元素的计数
print(c['a']) # 输出 3
print(c['b']) # 输出 2
print(c['c']) # 输出 1
print(c['d']) # 输出 0(不存在的元素计数为 0)
# 更新计数
c.update(['a', 'd', 'd'])
print(c) # 输出 Counter({'a': 4, 'd': 2, 'b': 2, 'c': 1})
在这个示例中,Counter
对象统计了列表中各元素的出现次数,并且可以通过 update
方法更新计数。
总结
- Go 中的
context
包:用于在 Goroutine 之间传递上下文信息,处理超时和取消操作。 - Python 中的
collections
包:提供了多种有用的集合数据类型,如defaultdict
和Counter
,用于简化特定场景下的编程任务。
通过这些示例,你可以更好地理解和使用 Go 的 context
包和 Python 的 collections
包。