[d]Python多线程的问题

konig2012 2012-09-26 11:25:24
使用Python创建了两个线程,线程A接收并解析消息,然后把解析出来的信息放入队列中,线程B从队列中取出信息来写数据库。当信令的速度是每秒十几个时,线程B写一次数据库一般都是1毫秒左右。当信令的速度是每秒几十个或者上百时,线程B写一次数据库甚至达到了几百毫秒,结果队列中的信息越来越多,线程B都来不及处理。
查看程序的日志,发现在线程调度中,线程A不停地在接收和解析信令,占用了大量的时间。在线程A大量的处理日志中,偶尔能发现线程B写数据库的操作,感觉CPU时间都被线程A占用。
怎样优化处理?使得信令量大时,线程B能够正常写数据库。
-----------------------------
Double行动:
原帖分数:90
...全文
569 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tkminigame 2012-11-28
  • 打赏
  • 举报
回复
引用 3 楼 xugangjava 的回复:
开两个进程multiprocessing 进程A 进程B A B间共享一个队列, B进程写数据 批量写更快 队列累计到 几千条后告诉进程B开个数据库连接 begin tran 1000 次 insert end tran; 批量一次写入,减少请求数据库连接次数,同时提高写入效率。
怎么共享一个队列?求请教
panghuhu250 2012-11-28
  • 打赏
  • 举报
回复
引用 6 楼 howema 的回复:
引用 2 楼 qq120848369 的回复:Python的多线程有坑,是伪多线程。 也就是说,两个线程不是并发的,是线程1执行完了停下才执行线程2,线程2完了再执行线程1. 用 _thread 模块吧。 有验证过吗?
search "python GIL". http://wiki.python.org/moin/GlobalInterpreterLock
konig2012 2012-11-28
  • 打赏
  • 举报
回复
引用 7 楼 xmnathan 的回复:
确实,用python多线程和轮询差不多……不是真多线程,我们项目里也踩过这个坑
你能讲解一下当时你的现象吗?我想进一步了解一下。
konig2012 2012-11-27
  • 打赏
  • 举报
回复
看来只能尽量不救,想要用Python彻底解决这个问题很难啊。
howema 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 qq120848369 的回复:
Python的多线程有坑,是伪多线程。 也就是说,两个线程不是并发的,是线程1执行完了停下才执行线程2,线程2完了再执行线程1. 用 _thread 模块吧。
有验证过吗?
xugangjava 2012-11-13
  • 打赏
  • 举报
回复
没看到代码, 那就是写一次commit一次吧?换成批量commit吧
qq120848369 2012-11-13
  • 打赏
  • 举报
回复
引用 6 楼 howema 的回复:
引用 2 楼 qq120848369 的回复:Python的多线程有坑,是伪多线程。

也就是说,两个线程不是并发的,是线程1执行完了停下才执行线程2,线程2完了再执行线程1.

用 _thread 模块吧。

有验证过吗?


用Python有经验的同学都吃过亏,总有那么一天你也会遇到。
  • 打赏
  • 举报
回复
确实,用python多线程和轮询差不多……不是真多线程,我们项目里也踩过这个坑
konig2012 2012-11-12
  • 打赏
  • 举报
回复
引用 3 楼 xugangjava 的回复:
开两个进程multiprocessing 进程A 进程B A B间共享一个队列, B进程写数据 批量写更快 队列累计到 几千条后告诉进程B开个数据库连接 begin tran 1000 次 insert end tran; 批量一次写入,减少请求数据库连接次数,同时提高写入效率。
我数据库连接就一直连着的,不是写一条就连接一次。
xugangjava 2012-11-05
  • 打赏
  • 举报
回复
开两个进程multiprocessing 进程A 进程B A B间共享一个队列, B进程写数据 批量写更快 队列累计到 几千条后告诉进程B开个数据库连接 begin tran 1000 次 insert end tran; 批量一次写入,减少请求数据库连接次数,同时提高写入效率。
qq120848369 2012-09-26
  • 打赏
  • 举报
回复
Python的多线程有坑,是伪多线程。

也就是说,两个线程不是并发的,是线程1执行完了停下才执行线程2,线程2完了再执行线程1.

用 _thread 模块吧。
Gloveing 2012-09-26
  • 打赏
  • 举报
回复
使用线程同步,或者当队列达到一定长度,就暂停线程A的操作一会

37,744

社区成员

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

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