1. 主要是线程方面的差异。
Windows下,把cx_Oracle.connect(connectedId)得到的handle传给定时器线程,主线程和和定时器可以用同一个handle。
但Linux不能这么做。必须把船歌定时器的线程的handle,另外生成。定时器是结束后,再新启一个线程。定时器相关的这些线程可以用同一个handle,但不能和主线程用同一个。
估计可能是不能同一个时间,对Oracle来说,两个不同的进程用同一个handle来连接。真实原因,现在不清楚。下面粘贴部分代码
def consult_task(stageDict, lock, span, db): if not TimerRun: return # consulted = settlePack.pack_stage_consult_completed(SettleDay) completed, failed = settleDB.consult_finished_task(db, span, SettleDay) for i, elapse in completed: set_mul_status(i, stageDict, lock, 'completed', elapse) for i, elapse in failed: set_mul_status(i, stageDict, lock, 'failed', elapse) timer = threading.Timer(span, consult_task, args=(stageDict, lock, span, db) ) timer.start() def period_consult_task(stageDict, lock, span, connectedId): if IsLinux: db = settleDB.get_db_handle(connectedId) else: db = DBpart timer = threading.Timer(span, consult_task, args=(stageDict, lock, span, db)) timer.start()