Late to answer. Seems no one did, so I'd say don't write event listeners that run in a Python interpreter that FreeSWITCH knows nothing about and uses threading. 

I looked at doing something similar in Python in the 1.2 days and after a couple of roadblocks like this, I took the advice of the wiki and the developers and developed what I needed in Lua. It worked out very well.

Python gets some love in Confluence, so I assume people use it, though. I know for a fact that you can start a Lua event listener by executing a luarun command via Python ESL API. Maybe it would also work in this case to run a Python script in the interpreter managed by mod_python. Let FS manage thread state.


On Tue, Apr 11, 2017 at 1:03 AM, Mohd Kamal Bin Mustafa <kamal.mustafa@gmail.com> wrote:
I have this python code:-

import time
import json
import logging
import threading

from freeswitchESL import ESL

class EventThread(threading.Thread):
    def __init__(self, target, args):
        super(EventThread, self).__init__()
        self.target = target
        self.args = args

    def run(self):
        print("Running target")
        self.target(*self.args)

def on_channel_park(e):
    uuid = e.getHeader('Unique-ID')
    print("Ringing")
    conn.execute('ring_ready ', '', uuid)
    conn.execute('sleep', '5500', uuid)
    conn.execute('answer', '', uuid)
    print("answered, playing media ...")
    media_url = 'http://www.noiseaddicts.com/samples_1w72b820/17.mp3'
    resp = conn.execute("playback", media_url, uuid)
    print(resp.getHeader("Reply-Text"))
    print("playback done")
    print(resp)

if __name__ == '__main__':
    conn = ESL.ESLconnection('127.0.0.1', '8021', 'mypass')
    conn.events('plain', 'all')
    while True:
        e = conn.recvEvent()
        uuid = e.getHeader('Unique-ID')
        events_message = json.loads(e.serialize('json'))
        event_name = events_message['Event-Name'].lower()
        method_name = 'on_%s' % event_name
        print(method_name)

        if event_name == 'channel_park':
            print("spawning thread")
            t = EventThread(on_channel_park, args=(e,))
            t.start()

        if event_name == 'playback_stop':
            conn.execute("hangup", "", uuid)
            print("Hanging up")

Above, the code will stuck at conn.execute('ring_ready ', '', uuid) in
on_channel_park(). It never went pass through until I hangup the call.
In freeswitch log, it stopped at executing park().

But if I moved ring_ready, sleep, answer outside of the thread it will
work, i.e I can hear a playback:-

def on_channel_park(e):
    uuid = e.getHeader('Unique-ID')
    print("answered, playing media ...")
    media_url = 'http://www.noiseaddicts.com/samples_1w72b820/17.mp3'
    resp = conn.execute("playback", media_url, uuid)
    print(resp.getHeader("Reply-Text"))
    print("playback done")
    print(resp)

if __name__ == '__main__':
    conn = ESL.ESLconnection('127.0.0.1', '8021', 'mypass')
    conn.events('plain', 'all')
    while True:
        e = conn.recvEvent()
        uuid = e.getHeader('Unique-ID')
        events_message = json.loads(e.serialize('json'))
        event_name = events_message['Event-Name'].lower()
        method_name = 'on_%s' % event_name
        print(method_name)

        if event_name == 'channel_park':
            print("Ringing")
            conn.execute('ring_ready ', '', uuid)
            conn.execute('sleep', '5500', uuid)
            conn.execute('answer', '', uuid)
            print("spawning thread")
            t = EventThread(on_channel_park, args=(e,))
            t.start()

Any idea why this happen ?

_________________________________________________________________________
Professional FreeSWITCH Consulting Services:
consulting@freeswitch.org
http://www.freeswitchsolutions.com

Official FreeSWITCH Sites
http://www.freeswitch.org
http://confluence.freeswitch.org
http://www.cluecon.com

FreeSWITCH-users mailing list
FreeSWITCH-users@lists.freeswitch.org
http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
http://www.freeswitch.org