๐ 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 | ๐ string | Log file path | ./logs |
log.level | ๐ string | Log level | info |
worker.runPolicy | ๐๏ธ string | Worker policy | simple |
worker.pool.enabled | โ boolean | Enable thread pool | false |
worker.pool.size | ๐ข integer | Pool size | 5 |
๐ท Create Worker โ
bash
zfc --worker <worker_name>Example:
bash
zfc --worker order_processorThis 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
passAnd 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_system2๏ธโฃ Create Multiple Workers โ
bash
zfc --worker order_receiver
zfc --worker order_processor
zfc --worker order_notifier3๏ธโฃ 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 applications | Single-threaded sequential |
stable | ๐ก๏ธ Production | Auto recovery from exceptions |
safe | ๐ High concurrency | Thread isolation |
๐ Thread Pool Configuration โ
json
{
"๐ท worker": {
"๐ pool": {
"โ
enabled": true,
"๐ข size": 10
}
}
}- ๐ข
size: Set based on CPU cores, typicallyCPU 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)