搜索
查看: 1101|回复: 0

分享多线程调用python

[复制链接]

2

主题

10

帖子

176

积分

一级会员

Rank: 2

积分
176
发表于 2018-6-6 12:50:30 | 显示全部楼层 |阅读模式
自测打开15个utf8的TXT文件,三线程同时工作没问题。
jieba库自己上github下载放到lib->py->.res>DLLs文件下。
除去调用python的代码多线程打开文件看机子性能,自测打开一万左右的TXT文件。
有性能问题和其他问题自己去看python虚拟机的自行解决。
  1. import win.ui;
  2. import thread.manage;
  3. import fsys.dlg;
  4. import fsys.codepage;
  5. import string;
  6. import console;
  7. console.log();
  8. /*
  9. 要点1、一定要在主线程导入python库
  10. 主线程会负责创建python虚拟机,主线程退出不能再在任何线程调用python.
  11. */
  12. import py;
  13. /*DSG{{*/
  14. var winform = win.form(text="aardio form";right=639;bottom=469;max=false)
  15. winform.add(
  16. button={cls="button";text="打开文件";left=512;top=16;right=624;bottom=56;font=LOGFONT(name='微软雅黑';h=-24);z=2};
  17. button2={cls="button";text="转换文件";left=512;top=72;right=624;bottom=112;font=LOGFONT(name='微软雅黑';h=-24);z=3};
  18. button3={cls="button";text="退出";left=512;top=408;right=624;bottom=448;font=LOGFONT(name='微软雅黑';h=-24);z=4};
  19. listview={cls="listview";left=16;top=16;right=496;bottom=448;edge=1;font=LOGFONT(name='微软雅黑';h=-24);z=1}
  20. )
  21. /*}}*/

  22. winform.listview.insertColumn("文本地址",350,,0x0/*_LVCFMT_LEFT*/);
  23. winform.listview.insertColumn("状态",-1,,0x0/*_LVCFMT_LEFT*/);

  24. //python代码
  25. var pyCode = /**

  26. #encoding=utf-8
  27. import sys
  28. sys.path.append("../")
  29. import jieba
  30. import jieba.posseg as pseg
  31. jieba.initialize()
  32. def cut(sent):
  33.     words = pseg.cut(sent)
  34.     for word, flag in words:
  35.        print(word,flag)

  36. **/

  37. //执行Python3 的代码
  38. py.exec( pyCode );

  39. /*
  40. 要点2、一定要在主线程释放GIL,之后任何python调用都在在py.lock里执行
  41. 注意,只有你确实要在多个线程并发调用python时,才需要使用GIL。
  42. */
  43. py.releaseThread();

  44. //创建线程管理器,共3个线程
  45. threadmanage = thread.manage(3);

  46. var 转换文件编码 = function(winform){
  47.         import console;
  48.         import win.ui;
  49.         import fsys.codepage;
  50.         import string;
  51.         import py;
  52.         for(i=1;winform.listview.count;1){       
  53.                 if(winform.listview.getItemText(i,2) = "没完成"){
  54.                         winform.listview.setItemText("进行中",i,2);
  55.                         path = winform.listview.getItemText(i);
  56.                     var 文件编码 = fsys.codepage.load(path);
  57.                     var l = 1;
  58.                     for line in string.lines(文件编码) {
  59.                               l++;
  60.                               /*
  61.                                 要点3、启用GIL以后,任何python调用都必须在py.lock里执行
  62.                                 python并不支持真正的多线程,所有调用都要加锁互斥运行。
  63.                                 */
  64.                               py.lock(
  65.                                       function(){
  66.                                               py.main.cut(line);       
  67.                                       }
  68.                               )
  69.                                 //console.log(i,line,l + "行。");
  70.                     }
  71.                     winform.listview.setItemText("已完成",i,2);
  72.                 }
  73.         }
  74.         //释放python GIL
  75.         py.releaseThread();
  76. }

  77. winform.button.oncommand = function(id,event){
  78.     var l = 0;
  79.         var path = fsys.dlg.openEx("文本文件|*.txt||","打开需要导入数据库的txt文件",,winform.hwnd,,1048576);
  80.         for(k,v in path){
  81.                 l++;
  82.                 winform.listview.addItem(v);
  83.                   winform.listview.setItemText("没完成",l,2);
  84.         }
  85. }

  86. winform.button2.oncommand = function(id,event){
  87.         if(winform.listview.count = 0){
  88.                 winform.msgbox("没有文件。");               
  89.         }
  90.         else {
  91.                 for(i=1;3;1){
  92.                         threadmanage.create(转换文件编码,winform);
  93.                 }       
  94.         }       
  95. }

  96. winform.button3.oncommand = function(id,event){
  97.         winform.close();
  98. }

  99. threadmanage.waitClose();
  100. winform.show();
  101. win.loopMessage();
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-18 00:51 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表