IDApython多进程编程探索

**python的多线程因为GIL全局解释锁的存在,所以python多线程实质上效率和单线程差不多。要想真正在效率上得到提高,必须使用多进程。**多进程必须要用multiprocess类。本博验证IDApython多进程编程的不可行性。

多进程多线程基础概念

并发:在一段时间内要处理A、B、C三个任务。
并行:在一刻时间A、B、C三个任务一起处理。
守护进(线)程:伴随主进程执行的进程,主进程退出时,守护进程立刻结束。
默认情况下,当进程退出时,它会尝试终止其所有守护进程及其子进程。标志:daemon
a.join()方法:主线程阻塞暂停,等待进程a执行结束后再继续往下运行。

多进程实现模板

# -*- coding:utf-8 -*-
from multiprocessing import Process
import time

def fun1(t):
    print 'this is fun1',time.ctime()
    time.sleep(t)
    print 'fun1 finish',time.ctime()

def fun2(t):
    print 'this is fun2',time.ctime()
    time.sleep(t)
    print 'fun2 finish',time.ctime()

if __name__ == '__main__':
    a=time.time()
    p1=Process(target=fun1,args=(4,))
    p2 = Process(target=fun2, args=(6,))
    p1.start()
    p2.start()
    p1.join() 
    #p2.join()
    b=time.time()
    print 'finish',b-a

首先看这一坨经典的代码,新建这坨代码为一个python脚本运行,发现会在本目录下生成一个同名称的pyc文件(代码中千万不要有中文注释,有中文注释就不会生成pyc文件,运行结果也是错的
在这里插入图片描述
使用process explorer来观察我们的python脚本进程除了生成IDLE一个进程,还应有一层我们定义的两个进程。如图所示,可以看到我们定义的两个进程成功执行。

我这里脚本里开启的子进程执行打印print函数并不会打印到IDLE上,但是子进程的的确确是去执行了target指定的函数。当子进程执行target指定的函数出错时,就会闪退,让人误以为好像脚本里调用多进程的流程出错了一样。可以在target指定的函数中添加writelog小函数以写日志的方式来记录子进程执行target指定的函数的进度和遇到的错误。

Debug 多进程的Target函数

p1=Process(target=fun1,args=(4,))
p2 = Process(target=fun2, args=(6,))

如上图所示,这是调用进程启用目标函数fun1,和fun2的语句。
现实项目中这两个函数fun1、fun2可能是比较复杂的。有可能进程会在执行函数时失败,出现秒退。
在编写target目标函数时,一定要记住一个原则:
与父进程共享函数,不与父进程共享数据

要知道target指定的函数是在一个新开启的子进程运行的。如图explorer中显示可以清晰看到第三层pythonw.exe才是去执行target目标函数的进程。这就需要了解父进程与子进程的内存关系了。进程的内存是相互独立的,编写target目标函数时数据一定要独立。但是函数可以调用父脚本中写的函数。
在这里插入图片描述
子进程与父进程之间数据独立,python2.7可以使用进程间通信达到数据共享。但是尽量不要这样用,能重新再生产数据尽量重新生产,尽量不进行数据共享,因为据说python2.7数据共享有不少坑。

如果多进程需要与本地服务器进行通信的话,还需要考虑多进程是否会把本地服务器给搞炸的情况。

多进程失败的根本原因

虽然控制台版本idat64.exe运行IDApython时,处理的模块和生成的数据都是不相同的,(保证不访问同一数据,不必考虑线程锁那些)。但是仍然存在部分模块执行IDApython时发生异常错误,但是把模块拿出来单独执行IDApython时却发现能够正常输出数据。
在这里插入图片描述
根本原因是IDA不支持多进程,在使用IDA函数时,由于没有按规定等待排队调用API函数,所以出现了异常的错误。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摔不死的笨鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值