@space88man: thanks for this work, just write a message when the PR is considered finished to review the code changes.
Hi @miconda and Kamailio devs: this PR is now ready for code review.
The main difference:
In script_child_init
create a background task:
from dataclasses import dataclass
import os
import sys
import threading
import time
import KSR as KSR
# global variables corresponding to defined values (e.g., flags) in kamailio.cfg
FLT_ACC = 1
FLT_ACCMISSED = 2
FLT_ACCFAILED = 3
FLT_NATS = 5
FLB_NATB = 6
FLB_NATSIPPING = 7
@dataclass
class Script:
rank: int
pid: int
def child_task(kamailio: Script):
KSR.info(f"===== child task thread {kamailio.pid}\n")
## asyncio.run(child_task_async(kamailio))
count = 0
while True:
KSR.info(f"===== child task thread {kamailio.pid}:{count}\n")
time.sleep(10.0)
count += 1
def ksr_script_child_init(rank: int):
if rank <= 0:
return 1
kamailio = Script(rank, os.getpid())
flags = os.environ.get("TEST_THREADS", False)
if flags:
KSR.info("===== testing threads\n")
child_thread = threading.Thread(target=child_task, args=[kamailio], daemon=True)
child_thread.start()
KSR.info("===== thread started\n")
KSR.info("===== kamailio.child_init(%d:%d)\n" % (rank, kamailio.pid))
return 1
# etc etc
Before (master): the child task will run for 1/2 iterations at most and be blocked
After (this PR): the GIL is correctly freed and the child task runs concurrently with Kamailio SIP handling
Before (only one iteration then the Python thread is blocked forever):
INFO: ctl [io_listener.c:214]: io_listen_loop(): using epoll_lt io watch method (config)
INFO: jsonrpcs [jsonrpcs_sock.c:471]: jsonrpc_dgram_process(): a new child 0/41117
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== testing threads
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41120
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41120:0
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== thread started
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== kamailio.child_init(1:41120)
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== testing threads
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41121
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41121:0
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== thread started
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== kamailio.child_init(2:41121)
After (the Python background thread is running freely alongside Kamailio event loop):
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== testing threads
INFO: jsonrpcs [jsonrpcs_sock.c:471]: jsonrpc_dgram_process(): a new child 0/41137
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41140
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41140:0
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== thread started
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== kamailio.child_init(1:41140)
INFO: ctl [io_listener.c:214]: io_listen_loop(): using epoll_lt io watch method (config)
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== testing threads
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41141
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41141:0
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== thread started
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== kamailio.child_init(2:41141)
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41140:1
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41141:1
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41140:2
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41141:2
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41140:3
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41141:3
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41140:4
INFO: <core> [core/kemi.c:107]: sr_kemi_core_info(): ===== child task thread 41141:4
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.