#include #include #include #include #include #include using namespace std; void *fib_worker(gearman_job_st *job, void *cb_arg, size_t *result_size, gearman_return_t *ret_ptr); long fib(long n); static void usage(char *name); int main(int argc, char *argv[]) { int c; char *host = "127.0.0.1"; in_port_t port = 0; gearman_worker_st worker; while ((c = getopt(argc, argv, "h:p:")) != -1) { switch(c) { case 'h': host = optarg; break; case 'p': port = (in_port_t) atoi(optarg); break; default: usage(argv[0]); exit(1); } } if (argc != optind) { usage(argv[0]); exit(1); } gearman_worker_create(&worker); gearman_worker_add_server(&worker, host, port); gearman_worker_add_function(&worker, "fib", 10, fib_worker, NULL); while (1) { gearman_worker_work(&worker); } return 0; } void *fib_worker(gearman_job_st *job, void *cb_arg, size_t *result_size, gearman_return_t *ret_ptr) { char ch[256]; ostringstream os; int size = gearman_job_workload_size(job); strncpy(ch, (char *) gearman_job_workload(job), size); ch[size] = 0; long n = atol(ch); os << fib(n); string s = os.str(); //cout << ch << ": " << s << endl; *result_size = s.size(); *ret_ptr = GEARMAN_SUCCESS; return strdup(s.c_str()); } long fib(long n) { if (n < 2) { return 1; } else { return fib(n - 2) + fib(n - 1); } } static void usage(char *name) { cout << "Usage: " << name << " [-h ] [-p ] " << endl; cout << "\t-h - job server host" << endl; cout << "\t-p - job server port" << endl; }