From dba5899f8406f89fa38cf305f918d8def4bf3d93 Mon Sep 17 00:00:00 2001 From: Richard Zhu Date: Wed, 27 Nov 2024 00:38:39 +0000 Subject: [PATCH 1/4] restart docs build --- assets/pyper.png | Bin 31514 -> 0 bytes docs/Tutorial/Pipeline.md | 1 - docs/Tutorial/task.md | 1 - docs/index.html | 21 --------------------- 4 files changed, 23 deletions(-) delete mode 100644 assets/pyper.png delete mode 100644 docs/Tutorial/Pipeline.md delete mode 100644 docs/Tutorial/task.md delete mode 100644 docs/index.html diff --git a/assets/pyper.png b/assets/pyper.png deleted file mode 100644 index d08abbea60707ed1448bfd4b03db09d7e3570aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31514 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 diff --git a/docs/Tutorial/Pipeline.md b/docs/Tutorial/Pipeline.md deleted file mode 100644 index 9a70065..0000000 --- a/docs/Tutorial/Pipeline.md +++ /dev/null @@ -1 +0,0 @@ -# Pipeline \ No newline at end of file diff --git a/docs/Tutorial/task.md b/docs/Tutorial/task.md deleted file mode 100644 index 6f59a15..0000000 --- a/docs/Tutorial/task.md +++ /dev/null @@ -1 +0,0 @@ -# task \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index d97b1ba..0000000 --- a/docs/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - Pyper - - -
-

Welcome to Pyper

-
-
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam accumsan sapien eu odio malesuada, vel posuere nunc facilisis. Morbi auctor ipsum nec eros dictum, quis pulvinar lorem pharetra.

-

Sed varius, lacus sit amet luctus tincidunt, sapien lacus vehicula risus, nec congue erat neque nec nunc. Integer in sagittis lectus. Aliquam erat volutpat. Aenean malesuada purus non ipsum faucibus, quis scelerisque augue ultrices.

-

Curabitur efficitur magna id metus ultricies, nec auctor nulla bibendum. Ut vitae justo nec arcu tincidunt facilisis.

-
-
-

© 2024 Richard Zhu. All rights reserved.

-
- - \ No newline at end of file From a139fd525aaf7bafbbca1f5a2eccf619d32e2832 Mon Sep 17 00:00:00 2001 From: Richard Zhu Date: Wed, 27 Nov 2024 01:11:45 +0000 Subject: [PATCH 2/4] change syntax to | and > --- src/pyper/_core/pipeline.py | 12 ++++++------ tests/test_async.py | 16 ++++++++-------- tests/test_sync.py | 18 +++++++++--------- tests/test_task.py | 10 +++++----- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/pyper/_core/pipeline.py b/src/pyper/_core/pipeline.py index 2a79359..341d528 100644 --- a/src/pyper/_core/pipeline.py +++ b/src/pyper/_core/pipeline.py @@ -11,11 +11,11 @@ class Pipeline: - """A sequence of at least 1 connected Tasks. + """A sequence of at least 1 Tasks. Two pipelines can be piped into another via: ```python - new_pipeline = p1 >> p2 + new_pipeline = p1 | p2 # OR new_pipeline = p1.pipe(p2) ``` @@ -43,8 +43,8 @@ def pipe(self, other) -> Pipeline: raise TypeError(f"{other} of type {type(other)} cannot be piped into a Pipeline") return Pipeline(self.tasks + other.tasks) - def __rshift__(self, other: Pipeline) -> Pipeline: - """Allow the syntax `pipeline1 >> pipeline2`.""" + def __or__(self, other: Pipeline) -> Pipeline: + """Allow the syntax `pipeline1 | pipeline2`.""" return self.pipe(other) def consume(self, other: Callable) -> Callable: @@ -55,8 +55,8 @@ def consumer(*args, **kwargs): return consumer raise TypeError(f"{other} must be a callable that takes a generator") - def __and__(self, other: Callable) -> Callable: - """Allow the syntax `pipeline & consumer`.""" + def __gt__(self, other: Callable) -> Callable: + """Allow the syntax `pipeline > consumer`.""" return self.consume(other) def __repr__(self): diff --git a/tests/test_async.py b/tests/test_async.py index d02fba5..c26c670 100644 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -32,23 +32,23 @@ async def consumer(data): @pytest.mark.asyncio async def test_pipeline(): - p = task(f1) >> task(f2) + p = task(f1) | task(f2) assert p(1).__next__() == 1 @pytest.mark.asyncio async def test_joined_pipeline(): - p = task(af1) >> task(af2) >> task(af4, join=True) + p = task(af1) | task(af2) | task(af4, join=True) assert await p(1).__anext__() == 1 @pytest.mark.asyncio async def test_consumer(): - p = task(af1) >> task(af2) & consumer + p = task(af1) | task(af2) > consumer assert await p(1) == 1 @pytest.mark.asyncio async def test_invalid_first_stage_concurrency(): try: - p = task(af1, concurrency=2) >> task(af2) & consumer + p = task(af1, concurrency=2) | task(af2) > consumer await p(1) except Exception as e: assert isinstance(e, RuntimeError) @@ -58,7 +58,7 @@ async def test_invalid_first_stage_concurrency(): @pytest.mark.asyncio async def test_invalid_first_stage_join(): try: - p = task(af1, join=True) >> task(af2) & consumer + p = task(af1, join=True) | task(af2) > consumer await p(1) except Exception as e: assert isinstance(e, RuntimeError) @@ -68,7 +68,7 @@ async def test_invalid_first_stage_join(): @pytest.mark.asyncio async def test_error_handling(): try: - p = task(af1) >> task(af2) >> task(af3) & consumer + p = task(af1) | task(af2) | task(af3) > consumer await p(1) except Exception as e: assert isinstance(e, RuntimeError) @@ -77,13 +77,13 @@ async def test_error_handling(): @pytest.mark.asyncio async def test_unified_pipeline(): - p = task(af1) >> task(f1) >> task(af2) >> task(f2) & consumer + p = task(af1) | task(f1) | task(af2) | task(f2) > consumer assert await p(1) == 1 @pytest.mark.asyncio async def test_error_handling_in_daemon(): try: - p = task(af1) >> task(af2) >> task(f3, daemon=True) & consumer + p = task(af1) | task(af2) | task(f3, daemon=True) > consumer await p(1) except Exception as e: assert isinstance(e, RuntimeError) diff --git a/tests/test_sync.py b/tests/test_sync.py index 6026ee6..0ef2614 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -27,28 +27,28 @@ def consumer(data): return total def test_pipeline(): - p = task(f1) >> task(f2) + p = task(f1) | task(f2) assert p(1).__next__() == 1 def test_joined_pipeline(): - p = task(f1) >> task(f2) >> task(f3, join=True) + p = task(f1) | task(f2) | task(f3, join=True) assert p(1).__next__() == 1 def test_bind(): - p = task(f1) >> task(f4, bind=task.bind(1, 1, 1, k1=1, k2=2)) + p = task(f1) | task(f4, bind=task.bind(1, 1, 1, k1=1, k2=2)) assert p(1).__next__() == 1 def test_redundant_bind_ok(): - p = task(f1) >> task(f2, bind=task.bind()) + p = task(f1) | task(f2, bind=task.bind()) assert p(1).__next__() == 1 def test_consumer(): - p = task(f1) >> task(f2) & consumer + p = task(f1) | task(f2) > consumer assert p(1) == 1 def test_invalid_first_stage_concurrency(): try: - p = task(f1, concurrency=2) >> task(f2) & consumer + p = task(f1, concurrency=2) | task(f2) > consumer p(1) except Exception as e: assert isinstance(e, RuntimeError) @@ -57,7 +57,7 @@ def test_invalid_first_stage_concurrency(): def test_invalid_first_stage_join(): try: - p = task(f1, join=True) >> task(f2) & consumer + p = task(f1, join=True) | task(f2) > consumer p(1) except Exception as e: assert isinstance(e, RuntimeError) @@ -66,7 +66,7 @@ def test_invalid_first_stage_join(): def test_error_handling(): try: - p = task(f1) >> task(f2) >> task(f5) & consumer + p = task(f1) | task(f2) | task(f5) > consumer p(1) except Exception as e: print(e) @@ -76,7 +76,7 @@ def test_error_handling(): def test_error_handling_in_daemon(): try: - p = task(f5, daemon=True) >> task(f2) & consumer + p = task(f5, daemon=True) | task(f2) > consumer p(1) except Exception as e: print(e) diff --git a/tests/test_task.py b/tests/test_task.py index 1515c21..0579e1b 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -87,12 +87,12 @@ def test_async_task(): assert isinstance(p, AsyncPipeline) def test_piped_async_task(): - p = task(afunc) >> task(func) + p = task(afunc) | task(func) assert isinstance(p, AsyncPipeline) def test_invalid_pipe(): try: - task(func) >> 1 + task(func) | 1 except Exception as e: assert isinstance(e, TypeError) else: @@ -100,7 +100,7 @@ def test_invalid_pipe(): def test_invalid_async_pipe(): try: - task(afunc) >> 1 + task(afunc) | 1 except Exception as e: assert isinstance(e, TypeError) else: @@ -108,7 +108,7 @@ def test_invalid_async_pipe(): def test_invalid_consumer(): try: - task(func) & 1 + task(func) > 1 except Exception as e: assert isinstance(e, TypeError) else: @@ -116,7 +116,7 @@ def test_invalid_consumer(): def test_invalid_async_consumer(): try: - task(afunc) & func + task(afunc) > func except Exception as e: assert isinstance(e, TypeError) else: From 2430032d2f0036fa974927b3f9a1171f3290d4bc Mon Sep 17 00:00:00 2001 From: Richard Zhu Date: Wed, 27 Nov 2024 01:14:12 +0000 Subject: [PATCH 3/4] reduce timeout --- src/pyper/_core/sync_helper/output.py | 2 +- tests/test_sync.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pyper/_core/sync_helper/output.py b/src/pyper/_core/sync_helper/output.py index 59eeaca..b473bdf 100644 --- a/src/pyper/_core/sync_helper/output.py +++ b/src/pyper/_core/sync_helper/output.py @@ -38,7 +38,7 @@ def __call__(self, *args, **kwargs): tp.raise_error_if_exists() try: # Use the timeout strategy for unblocking main thread without busy waiting - if (data := q_out.get(timeout=1)) is StopSentinel: + if (data := q_out.get(timeout=0.1)) is StopSentinel: tp.raise_error_if_exists() break yield data diff --git a/tests/test_sync.py b/tests/test_sync.py index 0ef2614..621ebc1 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -17,7 +17,7 @@ def f4(a1, a2, a3, data, k1, k2): def f5(data): # Make queue monitor timeout on main thread - time.sleep(1.2) + time.sleep(0.2) raise RuntimeError def consumer(data): From 83ebd7c158707fb0a3b87721ad9961f6debd2f5f Mon Sep 17 00:00:00 2001 From: Richard Zhu Date: Wed, 27 Nov 2024 02:29:51 +0000 Subject: [PATCH 4/4] add slots --- src/pyper/_core/task.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pyper/_core/task.py b/src/pyper/_core/task.py index fcab208..1707be2 100644 --- a/src/pyper/_core/task.py +++ b/src/pyper/_core/task.py @@ -7,6 +7,9 @@ class Task: """The representation of a function within a Pipeline.""" + + __slots__ = "is_gen", "is_async", "func", "join", "concurrency", "throttle", "daemon" + def __init__( self, func: Callable,