小编use*_*279的帖子

list(dict.items()) 是线程安全的吗?

是使用list(d.items())下面的安全范例?

import threading

n = 2000

d = {}

def dict_to_list():
    while True:
        list(d.items())  # is this safe to do?

def modify():
    for i in range(n):
        d[i] = i

if __name__ == "__main__":
    t1 = threading.Thread(target=dict_to_list, daemon=True)
    t1.start()

    t2 = threading.Thread(target=modify, daemon=True)
    t2.start()
    t2.join()
Run Code Online (Sandbox Code Playgroud)

这个问题背后的背景是字典项视图上的迭代器检查字典大小是否改变的每一步,如下例所示。

d = {}
view = d.items()  # this is an iterable
it = iter(view)  # this is an iterator
d[1] = 1
print(list(view))  # this is ok, it prints [(1, 1)]
print(list(it))  # …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

13
推荐指数
1
解决办法
394
查看次数

将 Rc<dyn Trait> 作为函数参数传递时出错

将 aRc<dyn Trait>作为函数参数传递时,我面临一些奇怪的行为。下面的代码演示了这个问题。

use std::rc::Rc;

trait Trait {}

struct Struct {}

impl Trait for Struct {}

fn function(_t: Rc<dyn Trait>) {}

fn main() {
    let n = Rc::new(Struct {});

    // ok
    let r = Rc::clone(&n);
    function(r);

    // error, why?
    // function(Rc::clone(&n));
}
Run Code Online (Sandbox Code Playgroud)

如果我将 存储Rc在一个临时变量中,则一切正常。但是,如果我尝试Rc::clone在函数调用中直接调用,则会出现以下错误。

use std::rc::Rc;

trait Trait {}

struct Struct {}

impl Trait for Struct {}

fn function(_t: Rc<dyn Trait>) {}

fn main() {
    let n = Rc::new(Struct {});

    // ok
    let r …
Run Code Online (Sandbox Code Playgroud)

rust

10
推荐指数
1
解决办法
469
查看次数

标签 统计

python ×1

python-3.x ×1

rust ×1