本文目录导读:

我来介绍几种让Python脚本独立执行模块同步任务的方法:
使用 if __name__ == "__main__" 模式
这是最基础的方式,让模块既可以导入又可以独立运行:
# sync_module.py
import time
import logging
logging.basicConfig(level=logging.INFO)
def sync_data(source, target):
"""同步数据的主函数"""
logging.info(f"开始同步从 {source} 到 {target}")
# 模拟同步过程
time.sleep(2)
logging.info("同步完成")
return True
class SyncTask:
def __init__(self, name):
self.name = name
def run(self):
logging.info(f"执行同步任务: {self.name}")
# 执行同步逻辑
return sync_data("source", "target")
# 独立执行时的入口
if __name__ == "__main__":
import sys
task = SyncTask(sys.argv[1] if len(sys.argv) > 1 else "default")
task.run()
使用命令行参数解析(更适合复杂任务)
# advanced_sync.py
import argparse
import logging
import time
from pathlib import Path
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
class FileSync:
"""文件同步器"""
def __init__(self, source, target, recursive=False, dry_run=False):
self.source = Path(source)
self.target = Path(target)
self.recursive = recursive
self.dry_run = dry_run
def sync(self):
"""执行同步"""
if not self.source.exists():
logging.error(f"源路径不存在: {self.source}")
return False
logging.info(f"开始同步: {self.source} -> {self.target}")
if self.dry_run:
logging.info("dry-run模式,仅模拟同步")
return True
# 实际的同步逻辑
self._copy_files(self.source, self.target)
return True
def _copy_files(self, src, dst):
"""递归复制文件"""
if src.is_file():
if not dst.parent.exists():
dst.parent.mkdir(parents=True)
# 这里添加实际的文件复制逻辑
time.sleep(0.1)
elif src.is_dir() and self.recursive:
for item in src.iterdir():
self._copy_files(item, dst / item.name)
def main():
parser = argparse.ArgumentParser(description='文件同步工具')
parser.add_argument('source', help='源路径')
parser.add_argument('target', help='目标路径')
parser.add_argument('-r', '--recursive', action='store_true',
help='递归同步子目录')
parser.add_argument('--dry-run', action='store_true',
help='模拟运行,不实际执行')
parser.add_argument('--log-level', default='INFO',
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'])
args = parser.parse_args()
# 设置日志级别
logging.getLogger().setLevel(getattr(logging, args.log_level))
syncer = FileSync(args.source, args.target,
args.recursive, args.dry_run)
success = syncer.sync()
return 0 if success else 1
if __name__ == "__main__":
exit(main())
使用配置文件和定时执行
# scheduled_sync.py
import json
import schedule
import time
import logging
from datetime import datetime
logging.basicConfig(level=logging.INFO)
class TaskConfig:
def __init__(self, config_file):
with open(config_file, 'r') as f:
self.config = json.load(f)
def get_tasks(self):
return self.config.get('tasks', [])
class TaskRunner:
def __init__(self):
self.tasks = []
def add_task(self, name, func, schedule_time):
"""添加定时任务"""
self.tasks.append({
'name': name,
'func': func,
'schedule': schedule_time
})
# 设置定时执行
schedule.every().day.at(schedule_time).do(self._run_task, name, func)
logging.info(f"已添加定时任务: {name} 于 {schedule_time}")
def _run_task(self, name, func):
"""执行单个任务"""
logging.info(f"开始执行定时任务: {name} at {datetime.now()}")
try:
result = func()
logging.info(f"任务 {name} 完成: {result}")
except Exception as e:
logging.error(f"任务 {name} 失败: {e}")
def run_forever(self):
"""持续运行"""
logging.info("开始定时任务调度...")
while True:
schedule.run_pending()
time.sleep(1)
# 具体的同步函数
def sync_database():
"""同步数据库"""
logging.info("同步数据库...")
# 实际的数据库同步逻辑
return True
def sync_files():
"""同步文件"""
logging.info("同步文件...")
# 实际的文件同步逻辑
return True
if __name__ == "__main__":
# 创建任务运行器
runner = TaskRunner()
# 添加定时任务
runner.add_task("数据库同步", sync_database, "01:00") # 每天凌晨1点
runner.add_task("文件同步", sync_files, "02:00") # 每天凌晨2点
# 也可以立即执行一次
if len(sys.argv) > 1 and sys.argv[1] == "--now":
logging.info("立即执行所有任务")
for task in runner.tasks:
task['func']()
else:
runner.run_forever()
使用进程池并行执行
# parallel_sync.py
import multiprocessing
import time
import logging
from typing import List, Dict
logging.basicConfig(level=logging.INFO)
class SyncWorker:
"""同步工作器"""
def __init__(self, worker_id):
self.worker_id = worker_id
def sync_module(self, module_name):
"""同步单个模块"""
logging.info(f"Worker {self.worker_id}: 开始同步模块 {module_name}")
# 模拟同步过程
time.sleep(2)
logging.info(f"Worker {self.worker_id}: 完成模块 {module_name}")
return f"{module_name} 同步成功"
def sync_all_modules(modules: List[str], max_workers: int = 4):
"""并行同步所有模块"""
with multiprocessing.Pool(max_workers) as pool:
workers = [SyncWorker(i) for i in range(max_workers)]
# 分配任务
results = []
for i, module in enumerate(modules):
worker = workers[i % max_workers]
result = pool.apply_async(worker.sync_module, (module,))
results.append(result)
# 收集结果
for result in results:
try:
output = result.get(timeout=30)
logging.info(f"结果: {output}")
except Exception as e:
logging.error(f"同步失败: {e}")
if __name__ == "__main__":
modules = [
"用户模块",
"订单模块",
"产品模块",
"支付模块",
"库存模块",
"物流模块",
"报表模块",
"配置模块"
]
import sys
max_workers = int(sys.argv[1]) if len(sys.argv) > 1 else 4
start_time = time.time()
sync_all_modules(modules, max_workers)
duration = time.time() - start_time
logging.info(f"全部同步完成,耗时: {duration:.2f}秒")
使用装饰器模式简化任务定义
# decorator_sync.py
import functools
import logging
import time
logging.basicConfig(level=logging.INFO)
class SyncTaskRegistry:
"""同步任务注册器"""
_tasks = {}
@classmethod
def register(cls, name=None):
"""注册任务的装饰器"""
def decorator(func):
task_name = name or func.__name__
@functools.wraps(func)
def wrapper(*args, **kwargs):
logging.info(f"开始执行: {task_name}")
start_time = time.time()
try:
result = func(*args, **kwargs)
duration = time.time() - start_time
logging.info(f"完成 {task_name}, 耗时: {duration:.2f}秒")
return result
except Exception as e:
logging.error(f"{task_name} 失败: {e}")
raise
cls._tasks[task_name] = wrapper
return wrapper
return decorator
@classmethod
def run_all(cls):
"""运行所有注册的任务"""
results = {}
for name, task in cls._tasks.items():
try:
results[name] = task()
except Exception as e:
results[name] = str(e)
return results
@classmethod
def run_specific(cls, *names):
"""运行指定任务"""
results = {}
for name in names:
if name in cls._tasks:
try:
results[name] = cls._tasks[name]()
except Exception as e:
results[name] = str(e)
else:
logging.warning(f"任务 {name} 不存在")
return results
# 定义同步任务
@SyncTaskRegistry.register("用户数据同步")
def sync_users():
time.sleep(1)
return "同步了1000个用户"
@SyncTaskRegistry.register("订单同步")
def sync_orders():
time.sleep(2)
return "同步了500个订单"
@SyncTaskRegistry.register("产品数据同步")
def sync_products():
time.sleep(1.5)
return "同步了200个产品"
if __name__ == "__main__":
import sys
if len(sys.argv) > 1:
# 执行指定的任务
task_names = sys.argv[1:]
results = SyncTaskRegistry.run_specific(*task_names)
else:
# 执行所有任务
results = SyncTaskRegistry.run_all()
for task, result in results.items():
print(f"任务: {task} -> 结果: {result}")
使用方法示例:
# 直接运行 python sync_module.py python sync_module.py my_task # 带参数运行 python advanced_sync.py /source/path /target/path -r --dry-run # 定时运行 python scheduled_sync.py python scheduled_sync.py --now # 并行运行 python parallel_sync.py 4 # 使用4个进程 # 选择性运行 python decorator_sync.py "用户数据同步" "订单同步"
这些方法都能让Python脚本独立执行模块同步任务,你可以根据实际需求选择合适的方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播