我正在清理我写的一些Python代码,当时我不是那么知识渊博.主要是我正在消除由于对Python中的线程不完全理解而产生的一些复杂性.我需要创建一个线程安全的项目列表,我想通过不可变列表,而不是通常的锁定方法.我知道不可变对象在线程方面非常特殊,因为围绕不完整状态更改的所有线程安全问题都会消失.
所以,我问:以下代码是否是线程安全的?
class ImmutableList(object):
def __init__(self):
self._list = ()
def __iter__(self):
return self._list.__iter__()
def append(self, x):
self._list = self._list + tuple([x])
Run Code Online (Sandbox Code Playgroud)
我认为是,因为每次都会构建一个新列表.如果在另一个线程迭代它时更新列表,则旧列表将继续用于迭代的剩余部分.这对我来说很好,但可能不适合所有人.
这也是个好主意吗?我只想将其应用于列表大小较小的几种情况,并且列表不会发生太大变化(事件监听器会浮现在脑海中).
我如何使用RSpec测试以下查找程序?
def self.find_by_mbid(mbid)
super(mbid.downcase())
end
Run Code Online (Sandbox Code Playgroud)
我认为可能的唯一方法是预先将它存储在数据库中,我想避免,因为这是一个单元测试.我不知道如何在这里返回一个模拟,因为superRSpec几乎无法访问.
有没有更好的方法呢?或者单元测试对于这类事情来说太低级了?
我正在开发一个代表用户管理网络接口的应用程序,它会调用几个需要root进行更改的外部程序(例如ifconfig).(具体来说,更改本地接口的IP地址等)在开发过程中,我一直以root(ugh)运行IDE,以root身份运行调试器(double-ugh).最终用户是否有一种很好的方式在非root帐户下运行它们?我非常不喜欢GTK,wxPython,Python和我的应用程序在以root身份运行时所呈现的攻击面的大小.
我已经研究了功能,但它们看起来很不完整,我不确定我是否能够在Python中使用它们,特别是如果它们是基于线程的.我没有探索过的唯一选择是一个守护进程,它具有setuid位设置并代表UI完成所有根类型的东西.我对在项目早期引入这种复杂性犹豫不决,因为以root身份运行并不是用户的破解者.
我正在 Rust 中开发一个词法分析器。
所需的 API:
enum Token<'input> {
Name(&'input str)
}
let mut lexicon = LexiconBuilder::<Token>::new()
.token("[a-zA-Z]+", |s| Token::Name(s))
// among others
.build();
let mut lexer = Lexer::new(lexicon, "input");
Run Code Online (Sandbox Code Playgroud)
这个想法是用户可以提供一个正则表达式,以及一个当正则表达式匹配输入文本时运行的闭包。但是,我无法向生命周期检查器证明传递到token()的闭包中的切片存活时间足够长。从我的 POV 来看,这似乎是安全的,因为在您提供字符串之前不会返回令牌。
我花了很长时间试图通过所有类型来线程化输入生命周期,但是我似乎永远无法证明词典(因此,规则的处理程序)的生命周期将匹配/支配输入的生命周期。