最近写python写的尤其不顺利,更多的debug,逐渐的深入,产出却比较少。应该是个瓶颈期,坚持坚持,厚着脸皮也要坚持下去。

0x00 拷贝问题

程序中涉及到多进程和协程,大致的模型是开了2+个进程,每个进程里再开协程(提高多核CPU利用率)。又因为Python的multiprocessing和gevent是对头,某些东西不兼容(比如gevent和multiprocessing.Manager不能同时出现),所以虽然每个进程中做的操作(弱口令扫描)类似,结果存储以及进度方面都是在各个进程里完成的。于是就有了这样的代码:

def process_run():
pool = Pool(3) for count in range(4):
pool.apply_async(gevent_run, args(,)) pool.close()
pool.join() def gevent_run():
num_count = 0
pool = Pool(150) for count in range(500):
pool.add(gevent.spawn(verify_and_count, num_count)) pool.join() def verify_and_count(count):
if poc.verify():
count += 1 if count % 100 == 0:
print"Progress: %d/%d" % (count, all_count)

可以看到我在gevent_run函数里声明了一个num_count变量用于计数(当前扫描进度),也就是为每个进程都申请了一个这样的变量。但是在实际运行的时候,发现并没有输出进度信息,排查后发现count始终为0。

之前在一篇文章里看过Python的拷贝问题,在List和dict的时候,直接传参或者赋值是不会改变对应的变量在内存中的位置的,比如:

>>> a = [1,2,4]
>>> id(a)
42176920
>>> b = a
>>> id(b)
42176920

但是理解有些错误,以为所有的赋值都不会改变。实际上,如果=的右侧是一个新的变量的话,也会创建全新的内存空间,无论是int还是list:

>>> a = [1,2,4]
>>> id(a)
42176920
>>> b = a
>>> id(b)
42176920
>>> a = a + [2,3]
>>> a
[1, 2, 4, 2, 3]
>>> id(a)
42214744

最后解决这个问题,还是用到了list局部赋值,不会改变list本身位置的特点:

>>> a = [0]
>>> id(a)
42214744
>>> id(a[0])
14514580
>>> a[0] += 1
>>> id(a)
42214744
>>> id(a[0])
14514568

0x10 多进程和类对象的问题

class test():
def bb(self, a):
print a def run(self):
pool = Pool(processes=2) for count in range(4):
pool.apply_async(self.bb, args=(count,)) pool.close()
pool.join()

程序看起来没什么问题,但是在实际执行的时候,并没有调用bb函数。但如果是调用非成员函数,就没什么问题。后来同事给出了解决方法:

class test():
def bb(self, a):
print a def run(self):
pool = Pool(processes=2) for count in range(4):
pool.apply_async(self.bb()) pool.close()
pool.join()

看起来是解决了问题,但实际上并没有用到multiprocessing,直接变成了循环函数。后来查了一下资料,得出的结论:

Python2.7 多进程multiprocessing使用的pipe传递方法,实现用的是C pickle_dumpsm,这种方式不支持 instance method 传递。
所以,最一开始的传递方式无效,实际是因传递失败:子进程不会进行检查即不会报错,母进程作为僵尸等待,而子进程无效停止造成母进程结束退出。

http://stackoverflow.com/questions/14169550/how-to-use-multiprocessing-with-class-instances-in-python

http://stackoverflow.com/questions/27318290/why-can-i-pass-an-instance-method-to-multiprocessing-process-but-not-a-multipro

最后的解决方法,是把多进程和协程的调度函数放在了类外,这也应该是多进程和类掺和到一块儿的时候,正确的解决办法了吧。

0x20 VMware虚拟机 网络失效 解决方案

今天NAT的网络上不去了,纠结了两个小时,试了很多方案,最后也不知道是哪个起作用了。干脆总结个方法:

1) 我的电脑 - 右键 - 管理 - windows服务 : 开启所有vmware相关的服务,已经开启的重新启动。另外还要开启windows installer。

2) 虚拟机 - 网络首选项 - 恢复默认设置

3) 对应的虚拟机 - 删除原有网卡 - 添加新网卡

4) 删除/etc/network/interfaces里的内容,重新启动网卡

Python拷贝及多进程与类的问题的更多相关文章

  1. Python中使用多进程来实现并行处理的方法小结

    进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和 ...

  2. python 多线程和多进程

    多线程与多进程 知识预览 一 进程与线程的概念 二 threading模块 三 multiprocessing模块 四 协程 五 IO模型 回到顶部 一 进程与线程的概念 1.1 进程 考虑一个场景: ...

  3. python高级之多进程

    python高级之多进程 本节内容 多进程概念 Process类 进程间通讯 进程同步 进程池 1.多进程概念 multiprocessing is a package that supports s ...

  4. 第八篇:python高级之多进程

    python高级之多进程   python高级之多进程 本节内容 多进程概念 Process类 进程间通讯 进程同步 进程池 1.多进程概念 multiprocessing is a package ...

  5. 搞定python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

  6. python服务端多进程压测工具

    本文描述一个python实现的多进程压测工具,这个压测工具的特点如下: 多进程 在大多数情况下,压测一般适用于IO密集型场景(如访问接口并等待返回),在这种场景下多线程多进程的区分并不明显(详情请参见 ...

  7. python 面向对象进阶之元类metaclass

    一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...

  8. python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

  9. python多线程与多进程--存活主机ping扫描以及爬取股票价格

    python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...

随机推荐

  1. [改善Java代码]枚举项的数量限制在64个以内

    为了更好的使用枚举,Java提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用方法都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,EnumMap表示Key值必须是某一枚举 ...

  2. [改善Java代码]避免对象的浅拷贝

    建议43: 避免对象的浅拷贝 我们知道一个类实现了Cloneable接口就表示它具备了被拷贝的能力,如果再覆写clone()方法就会完全具备拷贝能力.拷贝是在内存中进行的,所以在性能方面比直接通过ne ...

  3. hdu 4284 深度优先搜索

    思路:就是找能走的走,遍历一边所有情况,满足就退出. Accepted 4284 328MS 2280K 2239 B C++ //#pragma comment(linker, "/STA ...

  4. PE制作实录 —— 补充说明

    上一篇博文中我提到了定制 PE 合盘的方法,可能还有一些朋友不是很懂,这里补充几点. 要点1: 菜单的排布 U盘启动时的界面,这里叫做主界面,而主界面下有时还会用到子界面,下面是我制作的PE的菜单目录 ...

  5. MySql索引的优缺点

    优点 有了索引.对于记录数量很多的表,可以提高查询速度. 缺点 索引是占用空间的. 索引会影响update insert delete速度 ALERT!!! 1.索引要创建在where和join用到的 ...

  6. .NET微信支付(H5仅限公众号支付)

    闲来无事,恰好有一个要用微信公众平台支付的功能,研究来研究去,就是要细心和多看腾讯提供的文档.当然有几个坑是很有必要说明一下的 公众号支付,这里统一叫H5支付,以下都是. 在做H5支付的时候,第一步就 ...

  7. 感受函数式编程-scala

    /** * Created by jx_luo on 2015/3/18. */object test03 { def main(Args:Array[String]): Unit ={ val st ...

  8. PHP学习笔记 - 进阶篇(1)

    PHP学习笔记 - 进阶篇(1) 数组 数组定义 $arr = array();表示创建一个空数组,并把创建的空数组赋值给变量$arr. 索引数组初始化 PHP有两种数组:索引数组.关联数组. 索引和 ...

  9. ios开发入门篇(二):Objective-C的简单语法介绍

    一:面向对象的思想 objective-c与C语言的编程思想不同,C语言是面向过程的编程,而objective-c则是面向对象的编程,所谓面向对象,我个人的理解,就是抽象.将具有一定共同点的实物抽象成 ...

  10. 学习 .net 的一些主要网站

    学习 .net 的一些主要网站 来自 http://www.cnblogs.com/trymybest121/articles/500176.html   http://msdn.microsoft. ...