Hello

I am testing web2py with uWSGI and some request have random timeout (after
IO Heavy operation is started , but it is spawned using subprocess.Popen())
And then progress is selected from DB Every 5 Seconds (Progress Percent
Insert,Commit to db is only done at each 5% intervals)
At the IO Heavy times , the progress status is Timedout! even tho I set
timeouts to really huge 6000 secs , it still timeout.

Also it seems that all uWSGI worker processes are running at the same core
as extraction process is running . how can i make it run in different cores
(to make use of multple cores?)

Here is my uWSGI config:

./uwsgi/uwsgi --http :8000 --chdir ./web2py/ --python-path ./web2py/
--module uwsgihandler \
--socket /tmp/web2py.sock -p 12  --harakiri-verbose --socket-timeout 6000
--harakiri-verbose 6000

Here is the controller looks like :

@service.jsonrpc
def import_new(case_id,source_path,extracted_path,
               custodian,batch_id,dedupe_scope,dedupe_fields):
    try:
        #print 'CID: %s, SP: %s, EP: %s, Cu: %s, BID: %s'% (case_id,
        #                                                   source_path,
        #                                                   extracted_path,
        #                                                   custodian,
        #                                                   batch_id)
        extracted_path = os.path.join(extracted_path,batch_id,"completed")
        query = db(db.casedb.id == case_id).select(db.casedb.name).last()
        db_name = query.name

        casesdb = caseutils.setupTBL(db_name, request.folder + 'databases')
        #print dedupe_mode
        import_id=casesdb.import_data.insert(custodian=custodian,
                                             case_id=case_id,
                                            batch_hash=batch_id,
                                            extracted_path = extracted_path,
                                            dedupe_scope=dedupe_scope,
                                            dedupe_mode=dedupe_fields)
        #print 'IMPORT_ID',import_id
        session.import_id=import_id
        _start_processing(case_id,extracted_path,request.folder +
"databases",import_id,custodian, dedupe_scope, dedupe_fields)
#THIS ONE is IO HEAVY but it is started as subprocess.Popen without waiting
for it to be done.

    except:
        print 'Err#',traceback.format_exc()
        raise
    return dict(case_id=case_id,extracted_path=extracted_path,
import_id=import_id)

def
_start_processing(case_id,extracted_path,db_path,import_id,custodian,dedupe_scope,dedupe_fields):
    import shlex
    cmd = "python ../processes/extractor_process.py %s '%s' '%s' %s '%s'
'%s' '%s'" %
(case_id,extracted_path,db_path,import_id,custodian,dedupe_scope,dedupe_fields)
    #print 'CMD:',cmd
    #tmp1 = shlex.split(cmd)
    tmp1 = [ x.replace("\0", "") for x in shlex.split(cmd) ]
    #print 'TMP1', tmp1
    subprocess.Popen(tmp1)                     #Start of the IO Heavy
process, i know it is not safe to do that way but we will add security
optimizations later.
    return True


@service.jsonrpc
def get_extraction_progress(import_id, db_name):               #EXTRACTION
PROGRESS!  Timeout Occours here When uWSGI is used ! Never occours before
using web2py Rocket
    casesdb = caseutils.setupTBL(db_name, request.folder + 'databases')
    rows = casesdb(casesdb.progress_data.import_id ==
import_id).select().last()

    if rows:
        return dict(extract_count = rows.extract_count,
            extract_file = rows.extract_file,
            extract_start = str(rows.extract_start),
            extract_end = str(rows.extract_end))
    else:
        return dict(extract_count = 0,
            extract_file = "",
            extract_start = "None",
            extract_end = "None")

@service.jsonrpc
def get_parsing_progress(import_id, db_name): #PARSER PROGRESS!  Timeout
Occours here When uWSGI is used ! Never occours before using web2py Rocket
    casesdb = caseutils.setupTBL(db_name, request.folder + 'databases')
    rows = casesdb(casesdb.progress_data.import_id ==
import_id).select().last()

    if rows:
        return dict(progress_percent = rows.progress_percent,
            processed_files = rows.processed_files,
            total_files = rows.total_files,
            process_start = str(rows.process_start),
            process_end = str(rows.process_end))
    else:
        return dict(progress_percent = 0,
            processed_files = "None",
            total_files = 0,
            process_start = "None",
            process_end = "None")

Reply via email to