Skip to content

Commit f88786c

Browse files
author
Luca
committed
release
1 parent f9fd6f2 commit f88786c

10 files changed

Lines changed: 83 additions & 109 deletions

File tree

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"env": {},
1313
"args": [
1414
"-x",
15-
"tests/scheduler/test_scheduler.py"
15+
"tests/scheduler/test_every.py"
1616
],
1717
"debugOptions": [
1818
"RedirectOutput"

fluid/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
"""Reusable server side python modules"""
2-
__version__ = "0.4.2"
2+
__version__ = "0.4.3"

fluid/scheduler/consumer.py

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from .constants import TaskPriority, TaskState
1515
from .task import Task
1616
from .task_run import TaskRun
17-
from .utils import WaitFor
1817

1918
ConsumerCallback = Callable[[TaskRun, "TaskManager"], None]
2019
AsyncExecutor = Callable[..., Coroutine[Any, Any, None]]
@@ -164,14 +163,9 @@ def num_concurrent_tasks_for(self, task_name: str) -> int:
164163
"""The number of concurrent tasks for a given task_name"""
165164
return len(self._concurrent_tasks[task_name])
166165

167-
async def queue_and_wait(self, task: str, **params: Any) -> TaskRun:
168-
run_id = self.execute(task, **params).id
169-
waitfor = WaitFor(run_id=run_id)
170-
self.register_handler(f"end.{waitfor.run_id}", waitfor)
171-
try:
172-
return await waitfor.waiter
173-
finally:
174-
self.unregister_handler(f"end.{waitfor.run_id}")
166+
async def queue_and_wait(self, task: str, **params: Any) -> Any:
167+
"""Execute a task by-passing the broker task queue and wait for result"""
168+
return await self.execute(task, **params).waiter
175169

176170
def execute(self, task: str, **params: Any) -> TaskRun:
177171
"""Execute a Task by-passing the broker task queue"""
@@ -210,20 +204,17 @@ async def _consume_tasks(self) -> None:
210204
task_run.start = microseconds()
211205
task_run.set_state(TaskState.running)
212206
task_context = task_run.task.create_context(self, task_run=task_run)
213-
info = await self.broker.get_tasks_info(task_name)
214-
if not info[0].enabled:
215-
task_run.set_state(TaskState.aborted)
216-
task_run.waiter.set_result(None)
207+
self._concurrent_tasks[task_name][task_run.id] = task_run
217208
#
218-
elif task_run.task.max_concurrency <= self.num_concurrent_tasks_for(
219-
task_name
220-
):
209+
if task_run.task.max_concurrency < self.num_concurrent_tasks_for(task_name):
221210
task_run.set_state(TaskState.rate_limited)
222211
task_run.waiter.set_result(None)
212+
elif not (await self.broker.get_tasks_info(task_name))[0].enabled:
213+
task_run.set_state(TaskState.aborted)
214+
task_run.waiter.set_result(None)
223215
#
224216
else:
225217
task_context.logger.info("start")
226-
self._concurrent_tasks[task_name][task_run.id] = task_run
227218
self.dispatch(task_run, "start")
228219
try:
229220
result = await task_run.task.executor(task_context)

fluid/scheduler/every.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,22 @@
55

66

77
class every(Scheduler):
8-
def __init__(self, delta: timedelta):
8+
def __init__(self, delta: timedelta, delay: timedelta = timedelta()):
99
self.delta = delta
10+
self.delay = delay
11+
self._started = None
1012

1113
def info(self) -> str:
1214
return str(self.delta)
1315

1416
def __call__(
1517
self, timestamp: datetime, last_run: Optional[CronRun] = None
1618
) -> Optional[CronRun]:
19+
if not last_run and self.delay:
20+
if not self._started:
21+
self._started = timestamp
22+
if timestamp - self._started < self.delay:
23+
return None
1724
year, month, day, hour, minute, second, _, _, _ = timestamp.timetuple()
1825
run = CronRun(year, month, day, hour, minute, second)
1926
if not last_run or timestamp - last_run.datetime >= self.delta:

fluid/webcli.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

poetry.lock

Lines changed: 39 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "aio-fluid"
3-
version = "0.4.2"
3+
version = "0.4.3"
44
description = "Tools for backend python services"
55
license = "BSD"
66
authors = ["Luca <luca@quantmind.com>"]
@@ -34,7 +34,7 @@ classifiers = [
3434

3535
[tool.poetry.dependencies]
3636
python = ">=3.8,<4"
37-
aio-openapi = "^2.8.0"
37+
aio-openapi = "^2.9.0"
3838
aioredis = "^2.0.0"
3939
ujson = "^5.1.0"
4040
inflection = "^0.5.1"
@@ -45,13 +45,13 @@ python-slugify = {version = "^6.1.0", extras = ["unidecode"]}
4545
python-json-logger = "^2.0.2"
4646
colorlog = "^6.6.0"
4747
aiohttp_cors = "^0.7.0"
48-
aiobotocore = {version = "^2.1.0", extras=["boto3"]}
49-
s3fs = {version = "^2022.2.0"}
48+
aiobotocore = {version = "~2.2.0", extras=["boto3"]}
49+
s3fs = {version = "^2022.3.0"}
5050
aio-kong = "^0.9.0"
5151
uvloop = "^0.16.0"
5252

5353
[tool.poetry.dev-dependencies]
54-
pytest = "^6.2.4"
54+
pytest = "^7.1.2"
5555
isort = "^5.9.3"
5656
black = "^22.1.0"
5757
flake8 = "^4.0.1"
@@ -60,7 +60,7 @@ flake8-commas = "^2.0.0"
6060
pytest-cov = "^3.0.0"
6161
pytest-aiohttp = "^1.0.4"
6262
codecov = "^2.1.12"
63-
mypy = "^0.931"
63+
mypy = "^0.942"
6464

6565
[build-system]
6666
requires = ["poetry-core>=1.0.0"]

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import os
33

44
import pytest
5+
from openapi.testing import TestClient, app_cli
56

67
from fluid.redis import FluidRedis
7-
from fluid.webcli import TestClient, app_cli
88

99
from .app import AppClient, create_app
1010

tests/scheduler/test_every.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import asyncio
2+
from datetime import datetime, timedelta
3+
4+
from fluid.scheduler import every
5+
6+
7+
async def test_delay():
8+
scheduler = every(timedelta(seconds=10), delay=timedelta(seconds=0.3))
9+
assert scheduler(datetime.now()) is None
10+
await asyncio.sleep(0.4)
11+
assert scheduler(datetime.now()) is not None

0 commit comments

Comments
 (0)