/* callback for task completed */ void *result_worker( void * data ) { gearman_worker_st worker; int *worker_num = (int*)data; gm_log( GM_LOG_TRACE, "worker %d started\n", *worker_num ); pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); set_worker(&worker); pthread_cleanup_push ( cancel_worker_thread, (void*) &worker); while ( 1 ) { gearman_return_t ret; ret = gearman_worker_work( &worker ); if ( ret != GEARMAN_SUCCESS ) { gm_log( GM_LOG_ERROR, "worker error: %s\n", gearman_worker_error( &worker ) ); gearman_job_free_all( &worker ); gearman_worker_free( &worker ); sleep(1); set_worker(&worker ); } } pthread_cleanup_pop(0); return NULL; }
int main(void){ gearman_worker_st worker; //Create the worker gearman_worker_create(&worker); //Connect the worker to the server and chech it worked gearman_return_t ret= gearman_worker_add_server(&worker, "localhost", 4730); if (gearman_failed(ret)){ return EXIT_FAILURE; } //register function, (worker, job_queue_name, timeout, function_to_do_work, context) ret = gearman_worker_add_function(&worker,"image",0,doing_work,NULL); if(gearman_failed(ret)){ return EXIT_FAILURE; } //Infinite loop to keep watching while(1){ //Does the work ret = gearman_worker_work(&worker); if ( ret != GEARMAN_SUCCESS ) { fprintf(stderr,"worker error: %s\n", gearman_worker_error( &worker ) ); gearman_job_free_all( &worker ); gearman_worker_free( &worker ); /* sleep on error to avoid cpu intensive infinite loops */ sleep(5); } } return EXIT_SUCCESS; }
/* do a clean exit */ void clean_worker_exit(int sig) { int *shm; /* give us 30 seconds to stop */ signal(SIGALRM, exit_sighandler); alarm(30); gm_log( GM_LOG_TRACE, "clean_worker_exit(%d)\n", sig); /* clear gearmans job, otherwise it would be retried and retried */ if(current_gearman_job != NULL) { if(sig == SIGINT) { /* if worker stopped with sigint, let the job retry */ } else { send_failed_result(current_job, sig); gearman_job_send_complete(current_gearman_job, NULL, 0); } /* make sure no processes are left over */ kill_child_checks(); } gm_log( GM_LOG_TRACE, "cleaning worker\n"); gearman_worker_unregister_all(&worker); gearman_job_free_all( &worker ); gm_log( GM_LOG_TRACE, "cleaning client\n"); gearman_client_free( &client ); mod_gm_free_opt(mod_gm_opt); #ifdef EMBEDDEDPERL deinit_embedded_perl(0); #endif if(worker_run_mode == GM_WORKER_STANDALONE) exit( EXIT_SUCCESS ); /* Now we attach the segment to our data space. */ if((shm = shmat(shmid, NULL, 0)) == (int *) -1) { perror("shmat"); gm_log( GM_LOG_TRACE, "worker finished: %d\n", getpid() ); _exit( EXIT_FAILURE ); } /* clean our pid from worker list */ if( shm[shm_index] == current_pid || shm[shm_index] == -current_pid ) { shm[shm_index] = -1; } /* detach from shared memory */ if(shmdt(shm) < 0) perror("shmdt"); _exit( EXIT_SUCCESS ); }
/* main loop of jobs */ void worker_loop() { while ( 1 ) { gearman_return_t ret; /* wait for a job, otherwise exit when hit the idle timeout */ if(mod_gm_opt->idle_timeout > 0 && ( worker_run_mode == GM_WORKER_MULTI || worker_run_mode == GM_WORKER_STATUS )) { signal(SIGALRM, idle_sighandler); alarm(mod_gm_opt->idle_timeout); } signal(SIGPIPE, SIG_IGN); ret = gearman_worker_work( &worker ); if ( ret != GEARMAN_SUCCESS ) { gm_log( GM_LOG_ERROR, "worker error: %s\n", gearman_worker_error( &worker ) ); gearman_job_free_all( &worker ); gearman_worker_free( &worker ); gearman_client_free( &client ); if( mod_gm_opt->dupserver_num ) gearman_client_free( &client_dup ); /* sleep on error to avoid cpu intensive infinite loops */ sleep(sleep_time_after_error); sleep_time_after_error += 3; if(sleep_time_after_error > 60) sleep_time_after_error = 60; /* create new connections */ set_worker( &worker ); create_client( mod_gm_opt->server_list, &client ); if( mod_gm_opt->dupserver_num ) create_client_dup( mod_gm_opt->dupserver_list, &client_dup ); } } return; }