如何在Python中创建可取消的任务?

时间:2017-03-19 16:22:02

标签: python multithreading asynchronous

我正在构建一个Python IDE,需要在光标下突出显示所有出现的名称(使用Jedi库)。找到事件的过程可能非常缓慢。

为了避免冻结GUI,我可以在另一个线程中运行搜索,但是当用户快速移动几个单词时,后台线程可能会在处理现在过时的任务时堆积起来。当用户移动到新名称时,我想取消之前发生的搜索。

在Python中看起来杀死一个线程很复杂。在Python 3.4 +中创建易于取消的后台任务的其他选项有哪些?

3 个答案:

答案 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可以简单地删除请求。