跳转到主要内容

以色列队列的快速实现

项目描述

以色列队列

以色列队列的快速Python (Cython) 实现。

GitHub Actions Workflow Status Read the Docs PyPI PyPI - Python Version

目录

  1. 概述
  2. 什么是以色列队列?
  3. 安装
  4. 文档
  5. 复杂度
  6. 同步示例
  7. 异步示例
  8. 许可证

概述

本项目实现了一个队列系统,其中每个项目都与一个“组”相关联。队列按组处理项目,确保同一组的项目一起出队。此实现提供了一种同步版本(IsraeliQueue)和一种异步版本(AsyncIsraeliQueue),使用asyncio

什么是以色列队列?

以色列队列是一种优先队列类型,其中任务在同一优先级下分组。将新任务添加到队列会导致它们跳过队列并一起分组。然后,按顺序,分组取出。

为什么这很有用?

以色列队列从批量处理分组任务中受益匪浅。例如,想象一个需要登录远程存储库以获取文件的机器人或API

def login(repo_name: str):
  return Session("repo_name")  # Expensive operation

def download_file(session: Session, filename: str):
  return Session.download(filename)

def logout(session: Session):
  session.logout

现在,我们有一个线程或asyncio任务将待下载的文件添加到队列中

from israeliqueue import IsraeliQueue
queue = IsraeliQueue()
queue.put("cpython", "build.bat")
queue.put("black", "pyproject.toml")
queue.put("black", "bar")  # Same repo as the second item
queue.put("cpython", "index.html")  # Same repository as the first item

普通队列会导致我们的机器人登录和登出四次,逐个处理每个项目。以色列队列将存储库分组在一起,节省了设置成本,并允许在同一个请求中下载它们

while True:
  group, items = queue.get_group()
  session = login(group)
  for item in items:
    download_file(session, item)
  logout(session)

如果下载过程一次接受多个文件,那就更高效了

session.download_files(*items)

其他用途可能包括批量处理AWS查询、批量处理numpy计算等等!

安装

要安装此包,只需pip install cisraeliqueue

您可以在项目中如下使用这些类

from israeliqueue import IsraeliQueue, AsyncIsraeliQueue

IsraeliQueue

这是以色列队列的同步实现。它提供基于组的任务处理,并支持阻塞和非阻塞队列操作。该类是线程安全的,可用于多线程环境。

AsyncIsraeliQueue

这是以色列队列的异步版本,使用Python的asyncio框架构建。它提供非阻塞、异步的队列操作方法,适用于需要高并发和异步任务管理的应用程序。


文档

完整的文档可以在我们的RTD页面上找到。


复杂度

  • put / put_nowait:O(1) - 在队列末尾插入。
  • get / get_nowait:O(1) - 从队列前端出队。
  • get_group / get_group_nowait:O(group) - 从同一组出队所有项目。
  • task_done:O(1) - 简单的账务记录,用于跟踪完成的任务。
  • join:O(1) - 阻塞,直到所有任务完成

同步示例

from israeliqueue import IsraeliQueue

# Initialize the queue
queue = IsraeliQueue(maxsize=10)

# Add items to the queue
queue.put('group1', 'task1')
queue.put('group1', 'task2')
queue.put('group2', 'task3')

# Get items from the queue
group, task = queue.get()
print(f"Processing {task} from {group}")

# Get all items from the same group
group, tasks = queue.get_group()
print(f"Processing all tasks from {group}: {tasks}")

# Mark the task as done
queue.task_done()

# Wait for all tasks to complete
queue.join()

异步示例

import asyncio
from israeliqueue import AsyncIsraeliQueue

async def main():
    # Initialize the queue
    queue = AsyncIsraeliQueue(maxsize=10)

    # Add items to the queue
    await queue.put('group1', 'task1')
    await queue.put('group1', 'task2')
    await queue.put('group2', 'task3')

    # Get items from the queue
    group, task = await queue.get()
    print(f"Processing {task} from {group}")

    # Get all items from the same group
    group, tasks = await queue.get_group()
    print(f"Processing all tasks from {group}: {tasks}")

    # Mark the task as done
    queue.task_done()

    # Wait for all tasks to complete
    await queue.join()

# Run the async example
asyncio.run(main())

许可证

本项目采用MIT许可证。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分布

此版本没有可用的源分布文件。请参阅有关生成分布存档的教程。

构建分布

cisraeliqueue-0.0.1a2-cp313-cp313-win_amd64.whl (80.1 kB 查看散列)

上传时间: CPython 3.13 Windows x86-64

cisraeliqueue-0.0.1a2-cp313-cp313-win32.whl (70.7 kB 查看散列)

上传于 CPython 3.13 Windows x86

cisraeliqueue-0.0.1a2-cp313-cp313-musllinux_1_2_x86_64.whl (513.0 kB 查看哈希值)

上传于 CPython 3.13 musllinux: musl 1.2+ x86-64

cisraeliqueue-0.0.1a2-cp313-cp313-musllinux_1_2_i686.whl (491.9 kB 查看哈希值)

上传于 CPython 3.13 musllinux: musl 1.2+ i686

cisraeliqueue-0.0.1a2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (504.9 kB 查看哈希值)

上传于 CPython 3.13 manylinux: glibc 2.17+ x86-64

cisraeliqueue-0.0.1a2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (479.5 kB 查看哈希值)

上传于 CPython 3.13 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

cisraeliqueue-0.0.1a2-cp313-cp313-macosx_11_0_arm64.whl (89.8 kB 查看哈希值)

上传于 CPython 3.13 macOS 11.0+ ARM64

cisraeliqueue-0.0.1a2-cp313-cp313-macosx_10_13_x86_64.whl (93.7 kB 查看哈希值)

上传于 CPython 3.13 macOS 10.13+ x86-64

cisraeliqueue-0.0.1a2-cp312-cp312-win_amd64.whl (80.4 kB 查看哈希值)

上传于 CPython 3.12 Windows x86-64

cisraeliqueue-0.0.1a2-cp312-cp312-win32.whl (70.7 kB 查看哈希值)

上传于 CPython 3.12 Windows x86

cisraeliqueue-0.0.1a2-cp312-cp312-musllinux_1_2_x86_64.whl (507.8 kB 查看哈希值)

上传于 CPython 3.12 musllinux: musl 1.2+ x86-64

cisraeliqueue-0.0.1a2-cp312-cp312-musllinux_1_2_i686.whl (491.3 kB 查看哈希值)

上传于 CPython 3.12 musllinux: musl 1.2+ i686

cisraeliqueue-0.0.1a2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (506.4 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64

cisraeliqueue-0.0.1a2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (478.2 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

cisraeliqueue-0.0.1a2-cp312-cp312-macosx_11_0_arm64.whl (90.5 kB 查看哈希)

上传于 CPython 3.12 macOS 11.0+ ARM64

cisraeliqueue-0.0.1a2-cp312-cp312-macosx_10_13_x86_64.whl (95.0 kB 查看哈希)

上传于 CPython 3.12 macOS 10.13+ x86-64

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面