Skip to content

๐Ÿ†• Create New Project โ€‹

๐Ÿ› ๏ธ Using zfc CLI Tool โ€‹

Zoo Framework provides the zfc command-line tool for quick project scaffolding.

๐Ÿ“ Create Project โ€‹

bash
zfc --create <project_name>

Example:

bash
zfc --create ecommerce_system

๐Ÿ—‚๏ธ Project Structure โ€‹

After creation, the project structure looks like:

ecommerce_system/
โ”œโ”€โ”€ ๐Ÿ“„ config.json              # ๐Ÿ”ง Main configuration
โ”œโ”€โ”€ ๐Ÿ“ src/                     # ๐Ÿ’ป Source code
โ”‚   โ”œโ”€โ”€ ๐Ÿš€ main.py             # ๐ŸŽฏ Application entry
โ”‚   โ”œโ”€โ”€ ๐Ÿ‘ท workers/            # ๐Ÿ‘ท Worker directory
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ””โ”€โ”€ *.py
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ฌ events/             # ๐Ÿ“ฌ Event definitions
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ””โ”€โ”€ *.py
โ”‚   โ”œโ”€โ”€ โš™๏ธ conf/               # โš™๏ธ Configuration classes
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ””โ”€โ”€ *.py
โ”‚   โ””โ”€โ”€ ๐Ÿ“‹ params/             # ๐Ÿ“‹ Parameter classes
โ”‚       โ”œโ”€โ”€ __init__.py
โ”‚       โ””โ”€โ”€ *.py
โ””โ”€โ”€ ๐Ÿ“ logs/                   # ๐Ÿ“ Log directory

๐Ÿ“„ config.json โ€‹

json
{
  "_exports": [],
  "๐Ÿ“ log": {
    "๐Ÿ“ path": "./logs",
    "๐Ÿ“Š level": "debug"
  },
  "๐Ÿ‘ท worker": {
    "๐ŸŽ›๏ธ runPolicy": "simple",
    "๐ŸŠ pool": {
      "๐Ÿ”ข size": 5,
      "โœ… enabled": false
    }
  }
}

Configuration options:

๐Ÿ”ง Option๐Ÿ“‹ Type๐Ÿ“ Description๐Ÿ”ข Default
log.path๐Ÿ“ stringLog file path./logs
log.level๐Ÿ“Š stringLog levelinfo
worker.runPolicy๐ŸŽ›๏ธ stringWorker policysimple
worker.pool.enabledโœ… booleanEnable thread poolfalse
worker.pool.size๐Ÿ”ข integerPool size5

๐Ÿ‘ท Create Worker โ€‹

bash
zfc --worker <worker_name>

Example:

bash
zfc --worker order_processor

This creates src/workers/order_processor_worker.py:

python
from zoo_framework.workers.base_worker import BaseWorker


class OrderProcessorWorker(BaseWorker):
    def __init__(self):
        BaseWorker.__init__(self, {
            "is_loop": True,
            "delay_time": 5,
            "name": "OrderProcessorWorker"
        })

    def _destroy(self, result):
        pass

    def _execute(self):
        # ๐Ÿ“ Write business logic
        pass

And registers in src/workers/__init__.py:

python
from .order_processor_worker import OrderProcessorWorker

๐Ÿ“Š Project Architecture Diagram โ€‹

mermaid
graph TB
    subgraph "๐Ÿ“ Project Root"
        C[๐Ÿ“„ config.json]
    end
    
    subgraph "๐Ÿ“ src/"
        M[๐Ÿš€ main.py]
        
        subgraph "๐Ÿ‘ท workers/"
            W1[order_worker.py]
            W2[payment_worker.py]
            WI[__init__.py]
        end
        
        subgraph "๐Ÿ“ฌ events/"
            E1[event_definitions.py]
            EI[__init__.py]
        end
        
        subgraph "โš™๏ธ conf/"
            CF1[app_config.py]
            CFI[__init__.py]
        end
        
        subgraph "๐Ÿ“‹ params/"
            P1[worker_params.py]
            PI[__init__.py]
        end
    end
    
    subgraph "๐Ÿ“ logs/"
        L1[app.log]
    end
    
    C --> M
    M --> W1
    M --> W2
    WI --> W1
    WI --> W2
    M --> E1
    M --> CF1
    M --> P1
    W1 --> L1
    W2 --> L1

๐Ÿ’ผ Complete Example โ€‹

1๏ธโƒฃ Create Project โ€‹

bash
zfc --create order_system
cd order_system

2๏ธโƒฃ Create Multiple Workers โ€‹

bash
zfc --worker order_receiver
zfc --worker order_processor
zfc --worker order_notifier

3๏ธโƒฃ Write Business Code โ€‹

๐Ÿ“„ src/workers/order_receiver_worker.py:

python
from zoo_framework.workers import BaseWorker
from zoo_framework.utils import LogUtils
from zoo_framework.event import EventChannelRegister
from zoo_framework.fifo.node import EventNode


class OrderReceiverWorker(BaseWorker):
    """
    ๐Ÿ“ฅ Order Receiver Worker - Receives and distributes orders
    """
    
    def __init__(self):
        super().__init__({
            "is_loop": True,
            "delay_time": 3,  # โฑ๏ธ Check every 3 seconds
            "name": "OrderReceiverWorker"
        })
    
    def _execute(self):
        # ๐Ÿ“ฆ Simulate receiving order
        order = {"order_id": f"ORD-{time.time()}", "amount": 199.99}
        LogUtils.info(f"๐Ÿ“ฅ Received order: {order['order_id']}")
        
        # ๐Ÿ“ค Send order event
        node = EventNode(
            topic="order.received",
            content=order,
            priority=50
        )
        EventChannelRegister.get_channel("order").push(node)

๐Ÿ“„ src/workers/order_processor_worker.py:

python
from zoo_framework.workers import BaseWorker
from zoo_framework.utils import LogUtils
from zoo_framework.event import EventChannelRegister


class OrderProcessorWorker(BaseWorker):
    """
    โš™๏ธ Order Processor Worker - Processes order business
    """
    
    def __init__(self):
        super().__init__({
            "is_loop": True,
            "delay_time": 1,  # โฑ๏ธ Process every second
            "name": "OrderProcessorWorker"
        })
    
    def _execute(self):
        # ๐Ÿ“ฅ Get order from event channel
        channel = EventChannelRegister.get_channel("order")
        node = channel.pop()
        
        if node and node.topic == "order.received":
            LogUtils.info(f"โš™๏ธ Processing order: {node.content['order_id']}")
            # ๐Ÿ’ฐ Deduct payment, reduce inventory...
            self.process_payment(node.content)

๐Ÿ“„ src/workers/order_notifier_worker.py:

python
from zoo_framework.workers import BaseWorker
from zoo_framework.utils import LogUtils


class OrderNotifierWorker(BaseWorker):
    """
    ๐Ÿ“ง Order Notifier Worker - Sends order notifications
    """
    
    def __init__(self):
        super().__init__({
            "is_loop": True,
            "delay_time": 5,
            "name": "OrderNotifierWorker"
        })
    
    def _execute(self):
        # ๐Ÿ“ง Send email/SMS notification
        LogUtils.info("๐Ÿ“ง Sending order notification")

4๏ธโƒฃ Configure config.json โ€‹

json
{
  "_exports": [],
  "๐Ÿ“ log": {
    "๐Ÿ“ path": "./logs",
    "๐Ÿ“Š level": "info"
  },
  "๐Ÿ‘ท worker": {
    "๐ŸŽ›๏ธ runPolicy": "stable",
    "๐ŸŠ pool": {
      "๐Ÿ”ข size": 10,
      "โœ… enabled": true
    }
  }
}

5๏ธโƒฃ Launch Application โ€‹

๐Ÿ“„ src/main.py:

python
from zoo_framework.core import Master

if __name__ == "__main__":
    # ๐ŸŽฏ Create Master instance
    master = Master()
    
    # ๐Ÿš€ Launch application
    master.run()

Run:

bash
cd src
python main.py

๐Ÿ”„ Data Flow Diagram โ€‹

mermaid
sequenceDiagram
    participant R as ๐Ÿ“ฅ OrderReceiver
    participant C as ๐Ÿ“ฌ EventChannel
    participant P as โš™๏ธ OrderProcessor
    participant N as ๐Ÿ“ง OrderNotifier
    
    loop Every 3 seconds
        R->>R: ๐Ÿ“ฆ Receive order
        R->>C: ๐Ÿ“ค Send order.received
    end
    
    loop Every 1 second
        P->>C: ๐Ÿ“ฅ Get event
        C-->>P: ๐Ÿ“ฆ Return order
        P->>P: ๐Ÿ’ฐ Process payment
        P->>P: ๐Ÿ“ฆ Reduce inventory
    end
    
    loop Every 5 seconds
        N->>N: ๐Ÿ“ง Send notification
    end

๐ŸŽฏ Configuration Best Practices โ€‹

๐Ÿ“ Log Levels โ€‹

๐Ÿ“Š Level๐Ÿ“ Use Case
debug๐Ÿ› Development debugging
info๐Ÿ“‹ Production environment
warningโš ๏ธ Warning messages
errorโŒ Error messages

๐ŸŽ›๏ธ Run Policies โ€‹

๐ŸŽ›๏ธ Policy๐Ÿ“ Use Caseโšก Characteristics
simple๐Ÿš€ Simple applicationsSingle-threaded sequential
stable๐Ÿ›ก๏ธ ProductionAuto recovery from exceptions
safe๐Ÿ”’ High concurrencyThread isolation

๐ŸŠ Thread Pool Configuration โ€‹

json
{
  "๐Ÿ‘ท worker": {
    "๐ŸŠ pool": {
      "โœ… enabled": true,
      "๐Ÿ”ข size": 10
    }
  }
}
  • ๐Ÿ”ข size: Set based on CPU cores, typically CPU cores * 2
  • โœ… enabled: Recommended for CPU-intensive tasks

โ“ FAQ โ€‹

Q: How to create multiple workers of the same type? โ€‹

A: Create different classes:

python
class OrderProcessorWorker1(BaseWorker):
    def __init__(self):
        super().__init__({"name": "OrderProcessor1"})

class OrderProcessorWorker2(BaseWorker):
    def __init__(self):
        super().__init__({"name": "OrderProcessor2"})

Q: How do workers communicate? โ€‹

A: Use the event system:

python
# Worker A sends
EventChannelRegister.get_channel("channel_name").push(node)

# Worker B receives
node = EventChannelRegister.get_channel("channel_name").pop()

Q: How to configure different config files for different environments? โ€‹

A: Use environment variables:

python
import os

config_file = os.getenv("ZOO_CONFIG", "config.json")
ParamsFactory(config_file)

๐Ÿ“š Next Steps โ€‹

ๅŸบไบŽ MIT ่ฎธๅฏๅ‘ๅธƒ