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 ?