关于Python使用oracle多线程并发操作的问题。。。

fengfengsaylove 2015-07-27 11:32:20
在网上找了些Python的多线程的文章,但是大都差不多,而且不着要点,,,
threads = []
t1 = threading.Thread(target=saveAlarm ,args=(merge_info,))
threads.append(t1)
t2 = threading.Thread(target=saveAlarm ,args=(merge_info2,))
threads.append(t2)
t3 = threading.Thread(target=saveAlarm ,args=(merge_info3,))
threads.append(t3)
t4 = threading.Thread(target=saveAlarm ,args=(merge_info4,))
threads.append(t4)
t5 = threading.Thread(target=saveAlarm ,args=(merge_info5,))
threads.append(t5)
t6 = threading.Thread(target=saveAlarm ,args=(merge_info6,))
threads.append(t6)
t7 = threading.Thread(target=saveAlarm ,args=(merge_info7,))
threads.append(t7)
t8 = threading.Thread(target=saveAlarm ,args=(merge_info8,))
threads.append(t8)

for t in threads :
#t.setDaemon(True)
t.start()
for t in threads :
t.join()

//上面这一部分是我自己按照网上的文章写的多线程
//接下来是使用oracle存储数据的代码

def saveAlarminfo(input) :
conf_file = './monitor.conf'
conf = ConfigParser.ConfigParser()
conf.read(conf_file)
oracle_g = conf.get('db' , 'oracle')
user_g = conf.get('db' , 'user')
passwd_g = conf.get('db' , 'passwd')
if None == oracle_g :
print 'There is not an oracle db!'
con = None
cur = None
type_list = [2,2,2]
if type(type_list) != type(input) :
print 'Error:saveAlarminfo(list),there is not a list.'
return
try :
con = cx_Oracle.connect(user_g , passwd_g , oracle_g)
cur = con.cursor()
for line in input :
if None==line or 13!=len(line) :
print 'Warn:length of this line is error.From saveAlarminfo()'
continue
#(28762, 21, 2015021800, 93, 2, 2756, '100023275628762', '500103', 41736, '10401', 1, 1, '201502180010000')
if 1 == line[4] :
sql = 'insert when idc=0 then into ht_alarminfo1 (ALARMID , ALARMTIME , TEMPLATEID , CITYID , AREAID , SCALE , NEID , COVERTYPE , RNCID , LAC
, CI , SAMPLERATIO , RELATENEID , STATUS , USERID) VALUES (' + str(line[12]) + ',' + str(line[2]) + ',' + str(line[1]) + ',' + str(line[9]) + ',' + str(line
[7]) + ',' + str(line[4]) + ',' + str(line[0]) + ',' + str(line[10]) + ',' + str(line[5]) + ',' + '0' + ',' + str(line[0]) + ',' + str(line[3]) + ',\'' + str
(line[6]) + '\',0,\'luozhang\') select count(*) idc from ht_alarminfo1 where ALARMID=' + str(line[12])
cur.execute(sql)
elif 2 == line[4] :
sql = 'insert when idc=0 then into ht_alarminfo1 (ALARMID , ALARMTIME , TEMPLATEID , CITYID , AREAID , SCALE , NEID , COVERTYPE , RNCID , LAC
, CI , SAMPLERATIO , RELATENEID , STATUS , USERID) VALUES (' + str(line[12]) + ',' + str(line[2]) + ',' + str(line[1]) + ',' + str(line[9]) + ',' + str(line[
7]) + ',' + str(line[4]) + ',' + str(line[6]) + ',' + str(line[10]) + ',' + str(line[5]) + ',' + str(line[8]) + ',' + str(line[0]) + ',' + str(line[3]) + ','
+ '0' + ',0,\'luozhang\') select count(*) idc from ht_alarminfo1 where ALARMID=' + str(line[12])
cur.execute(sql)
else :
print 'Error:there is no scale?'
continue
except cx_Oracle.DatabaseError, ex :
error, = ex.args
logging.error('Error.code =%s', error.code)
logging.error('Error.message =%s' , error.message)
finally :
con.commit()
if None == con :
print 'Error:cx_Oracle.connect()'
if None == cur :
print 'Error:cur.cursor()'
if None!=con and None!=cur :
print 'Succeed to link to oracle...'
else :
print 'Error:failed to link to oracle.'
closeOracle(cur , con)

def closeOracle(cur , con) :
if cur != None :
cur.close()
if con != None :
con.close()
print 'End to link to oracle ...............'

在测试数据的时候,按照上面这些代码,完全没有将数据存到oracle里去,而提供的数据都是有的。。。
请问,问题出在哪里?需要怎样改正?谢谢
...全文
1041 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯震惊 2015-08-20
  • 打赏
  • 举报
回复
python不要使用多线程,不知道有GIL呀?用多进程。
fengfengsaylove 2015-07-30
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 fengfengsaylove 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 每个线程使用各自的数据库连接。
我用了比较简单的代码测试了一下,用多线程开多个连接,并且是连接不同的表,还是会报错,提示“已杀死”[/quote] 你没有真正做到“每个线程使用各自的数据库连接。” 另外提醒你使用多进程比多线程方便。[/quote] 解决了,我没有开启cx_Oracle的线程安全,被半路给杀掉了
赵4老师 2015-07-29
  • 打赏
  • 举报
回复
引用 8 楼 fengfengsaylove 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] 每个线程使用各自的数据库连接。
我用了比较简单的代码测试了一下,用多线程开多个连接,并且是连接不同的表,还是会报错,提示“已杀死”[/quote] 你没有真正做到“每个线程使用各自的数据库连接。” 另外提醒你使用多进程比多线程方便。
fengfengsaylove 2015-07-29
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
每个线程使用各自的数据库连接。
我用了比较简单的代码测试了一下,用多线程开多个连接,并且是连接不同的表,还是会报错,提示“已杀死”
fengfengsaylove 2015-07-29
  • 打赏
  • 举报
回复
引用 4 楼 panghuhu250 的回复:
saveAlarm vs saveAlarminfo. 居然没报错。
好吧,粘错了,不过两个函数差不太多
fengfengsaylove 2015-07-29
  • 打赏
  • 举报
回复
引用 5 楼 oatnehc 的回复:
1、测试不用线程是否能存; 2、测试单个线程是否成功,如果不成功,单步调试线程是什么原因; 3、测试多个线程并发。
就是第3项不行,前面两项都可以
chen_999876 2015-07-28
  • 打赏
  • 举报
回复
1、测试不用线程是否能存; 2、测试单个线程是否成功,如果不成功,单步调试线程是什么原因; 3、测试多个线程并发。
panghuhu250 2015-07-28
  • 打赏
  • 举报
回复
saveAlarm vs saveAlarminfo. 居然没报错。
fengfengsaylove 2015-07-28
  • 打赏
  • 举报
回复
是不是我那样写就不是?速度变得很慢,并不像是多线程啊
赵4老师 2015-07-27
  • 打赏
  • 举报
回复
每个线程使用各自的数据库连接。
李察德-泰森 2015-07-27
  • 打赏
  • 举报
回复
你自己测试的时候先不用线程,直接调用存取方法存一条看看

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧