用ngx.timer.at开一个后台协程专门负责连接redis获得订阅的数据,处理后保存在全局变量中,遍历semaphore全局池,对每一个semaphore执行post操作。
Core was generated by `nginx: worker process '.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000004433a8 in ngx_event_process_posted (cycle=0x12ef980, posted=0x7b03b0 <ngx_posted_events>)
at src/event/ngx_event_posted.c:31
31 ngx_delete_posted_event(ev);
(gdb) bt
#0 0x00000000004433a8 in ngx_event_process_posted (cycle=0x12ef980, posted=0x7b03b0 <ngx_posted_events>)
at src/event/ngx_event_posted.c:31
#1 0x00000000004414f1 in ngx_process_events_and_timers (cycle=0x12ef980) at src/event/ngx_event.c:259
#2 0x000000000044c127 in ngx_worker_process_cycle (cycle=0x12ef980, data="" at src/os/unix/ngx_process_cycle.c:753
#3 0x00000000004490ae in ngx_spawn_process (cycle=0x12ef980, proc=0x44c068 <ngx_worker_process_cycle>, data="">
name=0x55e0b0 "worker process", respawn=-4) at src/os/unix/ngx_process.c:198
#4 0x000000000044b380 in ngx_start_worker_processes (cycle=0x12ef980, n=8, type=-4)
at src/os/unix/ngx_process_cycle.c:358
#5 0x000000000044af50 in ngx_master_process_cycle (cycle=0x12ef980) at src/os/unix/ngx_process_cycle.c:243
#6 0x000000000041acd9 in main (argc=1, argv=0x7fff5c0f7b18) at src/core/nginx.c:359
(gdb) l
26 ev = ngx_queue_data(q, ngx_event_t, queue);
27
28 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
29 "posted event %p", ev);
30
31 ngx_delete_posted_event(ev);
32
33 ev->handler(ev);
34 }
35 }
(gdb) p *ev
$5 = {data = "" write = 0, accept = 0, instance = 0, active = 0, disabled = 0, ready = 0, _oneshot_ = 0,
complete = 0, eof = 0, error = 0, timedout = 0, timer_set = 0, delayed = 0, deferred_accept = 0, pending_eof = 0,
posted = 0, closed = 0, channel = 0, resolver = 0, cancelable = 0, available = 0,
handler = 0x520423 <ngx_http_lua_semaphore_handler>, index = 0, log = 0x12ef998, timer = {key = 0, left = 0x0,
right = 0x0, parent = 0x0, color = 0 '\000', data = 0 '\000'}, queue = {prev = 0x7b03b0 <ngx_posted_events>,
next = 0x0}}
因为对nginx内部代码了解不多,没有什么解决思路,还望达人指导。