我正在构建一个Python IDE,需要在光标下突出显示所有出现的名称(使用Jedi库)。找到事件的过程可能非常缓慢。
为了避免冻结GUI,我可以在另一个线程中运行搜索,但是当用户快速移动几个单词时,后台线程可能会在处理现在过时的任务时堆积起来。当用户移动到新名称时,我想取消之前发生的搜索。
在Python中看起来杀死一个线程很复杂。在Python 3.4 +中创建易于取消的后台任务的其他选项有哪些?
答案 0 :(得分:3)
我认为var friends = "Ryan, Kat, Luke, Harry";
var newFriends = friends.split(",");
for (var i = 0; i < newFriends.length; i++) {
if (newFriends[i].trim().length == 4) {
console.log(newFriends[i].trim());
}
就是答案
您可以创建一个线程/进程池,concurrent.futures
任何可调用的,接收submit
,如果需要,您可以Future
。
参考:https://docs.python.org/3/library/concurrent.futures.html
答案 1 :(得分:1)
好吧,我个人的最爱是工作队列。如果是一次性应用程序,您应该查看String.split(pattern, n)。使用非常简单和有趣。如果你想建立一些更“专业级”的东西,请看看像python rq这样的东西。
您可能还想查看celery
答案 2 :(得分:1)
另一个线程无法阻止该线程。这是操作系统限制而不是Python限制。你唯一能做的就是定期检查变量,如果设置,则停止线程本身(只返回)。
此外,Python中的线程受GIL的影响。这意味着CPU密集型操作在单独的线程中执行时仍会影响主循环,因为每个进程一次只能运行一个线程。
我建议您在单独的过程中运行搜索,您可以随时轻松取消。
YouCompleteMe的人正在做的是将Jedi包裹在HTTP server中,他们可以在后台查询。如果用户在完成返回之前移动光标,则IDE可以简单地删除请求。