问题标签 [tasklet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
36742 浏览

linux-kernel - SoftIRQ 和 Tasklet 之间的区别

在研究 Linux 中断处理时,我发现 Tasklet 和 SoftIRQ 是执行“下半部分”(优先级较低的工作)的两种不同方法。我理解这一点(非常真实的需要)。

不同之处在于,SoftIRQ 是可重入的,而 Tasklet 则不是。相同的 SoftIRQ 可以在不同的 CPU 上运行,而 Tasklet 则不是这样。

虽然我从表面上理解这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用 Tasklet,然后使用 SoftIRQ。

另外,我们所说的 Tasklet 是在 SoftIRQ 上制作的是什么意思?在我用 LKML 阅读的一本书中,有关于删除 Tasklet 的争论。我完全糊涂了,为什么要引入这样的功能?有些短视(没有冒犯的意思)?

对此的任何指示都会有很大帮助。

0 投票
1 回答
2804 浏览

python - 如何理解 appengine ndb.tasklet?

文档

NDB tasklet 是一段可能与其他代码同时运行的代码。如果您编写一个 tasklet,您的应用程序可以像使用异步 NDB 函数一样使用它:它调用返回 Future 的 tasklet;稍后,调用 Future 的 get_result() 方法得到结果。

文档中的解释和示例对我来说真的很神奇。我可以使用它,但很难正确理解它。

例如:

  1. 我可以在函数中放入任何类型的代码并将其装饰为 ndb.tasklet 吗?然后稍后将其用作异步功能。还是一定是appengine RPC?
  2. 这种装饰器是否也适用于我的电脑?
  3. 和pypy的tasklet一样吗
0 投票
1 回答
10990 浏览

c - tasklet和workqueue有什么区别

我是 Linux 设备驱动程序新手,想知道 和 之间的确切tasklet区别workqueue。我有以下疑问:

  1. 在中断/进程上下文中运行时,中断、tasklet 和工作队列使用哪个内核堆栈?
  2. tasklet 和 workqueue 将以什么优先级运行,我们可以修改它的优先级吗?
  3. 如果我实现自己的工作队列列表,我可以独立安排/优先考虑它吗?
0 投票
1 回答
399 浏览

linux-kernel - 动态小任务或工作队列

背景:我正在编写网络流量处理内核模块。我正在使用 netfilter 钩子获取数据包。所有过滤都在钩子函数内完成,但我不想在这里进行数据包处理。所以解决方案是小任务或工作队列。我知道它们之间的区别,我可以同时使用它们,但是我有一些问题,我需要一个建议。

  1. 小任务解决方案。首选。我可以为每个数据包创建和启动 tasklet,但谁来删除这个 tasklet?小任务功能?我认为这不是一个好主意 - 在 tasklet 执行时释放它。创建全局小任务池?好吧,因为在一个处理器上不可能有 2 个正在执行的小任务,所以池大小将是处理器的数量。但是如何确定 tasklet 何时可用于新用途?只有两种状态:shed 和 run,但没有“done”状态。好的,我可能可以用一些带有标志的结构来包装 tasklet。但这会不会太过分了?

  2. 工作队列解决方案。同样的问题:谁会删除工作?与小任务相同的“解决方案”?

  3. 工作队列解决方案 2. 由于模块加载,只需创建永久工作,将数据包保存到某个队列并在工作内部处理它们。可能是两个作品和两个队列:传入和传出。但我担心使用该解决方案我将只使用一个(或两个)处理器,因为看起来无法同时在几个处理器上执行工作。

  4. 还有其他解决方案吗?

0 投票
1 回答
472 浏览

linux - linux tasklets - 执行顺序

在我的大学里,我正在从事一个涉及一些内核编程的项目。其中一部分是可加载的内核模块,它为某些给定的中断注册中断处理程序。

现在我有中断处理程序和小任务使用的共享数据结构,我想知道我是否可以确定小任务的执行顺序与它们计划的顺序相同还是未定义?

例如,我的中断处理程序会不时被调用t1t2每次调用都会执行tasklet_schedule(&customTasklet);。现在,我可以确定当时安排的tasklett1会先执行吗?

0 投票
1 回答
952 浏览

linux-kernel - 如何从 irq 处理程序将值传递给 linux 内核 tasklet?

我有一个 Linux 驱动程序,其中有许多中断要由单个 tasklet 函数处理。

我想为所有这些注册相同的 tasklet,但根据接收到的 irq 更改其行为。我可以这样做吗?

您是否知道其他解决方案?

请不要建议在DECLARE_TASKLET()我已经知道这不起作用期间声明参数,因为该值是静态的并且不是由 irq 处理程序传递的。

0 投票
1 回答
397 浏览

tasklet - 如果在两者之间发生中断,tasklet 执行会发生什么

我对tasklet的了解:

  1. Tasklet 在启用所有中断的情况下运行。
  2. tasklet 在中断上下文中运行。
  3. 不可能是睡觉。
  4. 它以原子方式运行。
  5. 它有保证不会迟于下一个滴答声。

我的问题:

  1. 由于在下半部分启用了所有中断,如果一个小任务正在运行并且在任何中断之间会发生什么。(如果在 tasklet 执行期间中断被禁用,那么 tasklet 有什么好处)?
  2. 为什么要保证 tasklet 总是被安排到下一个时钟周期?
  3. 说tasklet是优先级为0(Hi priority tasklet)和优先级为6(Normal taslet)的softirq是否正确?
0 投票
1 回答
696 浏览

google-app-engine - 在 ndb gae 中始终使用异步 ndb 操作

我正在使用 gae 和 ndb 进行开发,我发现我必须为 ndb 获取和查询编写大量代码。有时我需要两个版本(有时是 3 个或更多)。

假设我在其中有以下模型和函数:

如您所见,MainEnt 具有三种返回“相同”(有时更多)结果但在不同上下文中使用的方法。

1)仅当我需要获取结果时才使用同步功能,并且获得该结果是唯一的“ndb操作”。

2) async 函数仅在我需要获取结果时使用,但我还执行了一些我想要重叠的其他 ndb 查询。

3)tasklet async 函数仅在我需要获取结果、获取此结果的子实体以及可能还执行一些其他 ndb 操作时使用。

因为我发现写了太多函数......只写一个异步tasklet函数是正确的,它将在前面的每种情况下被调用??

我的意思是,即使我只需要同步结果,我也会调用 get_created_by_async_tasklet,然后在函数返回的未来调用 get_results。

这样做对性能、容易出错等有什么不便吗?我发现对于每个查询、获取等始终使用 ndb 异步小任务要简单得多……并且仅在我需要时才调用其结果,或者以其他方式执行更多异步操作,然后再调用 get_results。

希望这能得到很好的解释......

提前致谢!

0 投票
1 回答
627 浏览

python - 与 ndb tasklet 并行执行 python 代码

首先我知道我可以使用线程来完成这样的任务,就像这样:

但是,在谷歌应用引擎中有一个叫做 ndb tasklets 的东西,根据他们的文档,你可以使用它们并行执行代码。

Tasklet 是一种在没有线程的情况下编写并发运行的函数的方法;tasklet 由事件循环执行,并且可以使用 yield 语句暂停自己的 I/O 或其他操作阻塞。阻塞操作的概念被抽象到 Future 类中,但 tasklet 也可能产生一个 RPC 以等待该 RPC 完成。

是否可以使用上面的线程完成类似示例的操作?

我已经知道如何使用 get_async() 处理检索实体(从他们在文档页面的示例中获得),但在并行代码执行方面我非常不清楚。

谢谢。

0 投票
1 回答
123 浏览

python - 在运行时创建小任务

刚从 Stackless Python 开始。我正在尝试在运行时创建一些小任务,即在调用stackless.run(). 我认为这个函数不会阻塞主线程,所以我可以在必要时创建新的小任务。所以我决定制作一个在 tasklet 中运行的 tasklet-creator 函数。这就是我所拥有的:

这段代码应该每 5 秒创建一个新的 tasklet,每个都应该打印“Hello, {number of tasklet}!” 无限次(也是每 5 秒一次)。预期的输出是:

但是运行代码时没有输出。

这里有什么问题?