def run(self) -> int: """Main execution entry point.""" # Parse replacements replacements_list = self.parse_replacements() if not replacements_list: self.logger.error("No replacements provided") return 1 total_tasks = len(replacements_list) self.logger.info(f"Starting total_tasks tasks with self.args.workers workers") # Prepare environment env = os.environ.copy() if self.args.env: for env_var in self.args.env: if '=' in env_var: k, v = env_var.split('=', 1) env[k] = v # Execute tasks in parallel start_time = time.time() with ProcessPoolExecutor(max_workers=self.args.workers) as executor: futures = {} for idx, replacements in enumerate(replacements_list): if self.cancel: break future = executor.submit( worker, idx, self.args.command, replacements, self.args.timeout, self.args.retries, env ) futures[future] = idx # Collect results as they complete for future in as_completed(futures): if self.cancel: break result = future.result() self.results.append(result) self._log_result(result) total_duration = time.time() - start_time # Summary self._print_summary(total_tasks, total_duration) # Save results if requested if self.args.output_json: self._save_results_json() if self.args.output_summary: self._save_summary_text() # Return exit code (0 if all succeeded) return 0 if all(r.success for r in self.results) else 1
parser.add_argument( "-o", "--output-json", help="Save detailed results to JSON file" )
parser.add_argument( "-t", "--timeout", type=int, default=60, help="Timeout per command in seconds (default: 60)" ) def run(self) -> int: """Main execution entry point
# All retries failed return TaskResult( task_id=task_id, args=tuple(replacements.items()), success=False, stdout="", stderr=stderr.strip() if 'stderr' in locals() else "Unknown error", exit_code=exit_code if 'exit_code' in locals() else -1, duration=time.time() - start_time, retries=retries ) class Mpall: """Main application class."""
# Test 1: Simple echo ./mpall.py -c "echo Task id done" -r id=1 -r id=2 -r id=3 def run(self) ->
parser.add_argument( "-e", "--env", action="append", default=[], help="Set environment variable (KEY=VALUE)" )
parser.add_argument( "--output-summary", help="Save summary to text file" ) v = env_var.split('='
parser.add_argument( "-w", "--workers", type=int, default=4, help="Number of parallel workers (default: 4)" )