更新一个最近发现的技巧,一行代码实现多线程/多进程,来源于python开发者微信公众号。

首先来看下代码:

import urllib2

from multiprocessing.dummy import Pool as ThreadPool

urls = [

'http://www.python.org',

'http://www.python.org/about/',

'http://www.onlamp.com/pub/a/python/2003

]

pool = ThreadPool(4)

results = pool.map(urllib2.urlopen, urls)

pool.close()

pool.join()

对,你没有看错,只要一行代码就可以把普通的任务变成并行任务。不用手动管理线程,一切都由map自动完成。这里演示的是多线程,如果要多进程的话只需把 from multiprocessing.dummy 改成 from multiprocessing ,就是这么任性!

以下为这个库的详细介绍:

在 Python 中有个两个库包含了 map 函数: multiprocessing 和它鲜为人知的子库 multiprocessing.dummy.

这里多扯两句: multiprocessing.dummy? mltiprocessing 库的线程版克隆?这是虾米?即便在 multiprocessing 库的官方文档里关于这一子库也只有一句相关描述。而这句描述译成人话基本就是说:”嘛,有这么个东西,你知道就成.”相信我,这个库被严重低估了!

dummy 是 multiprocessing 模块的完整克隆,唯一的不同在于 multiprocessing 作用于进程,而 dummy 模块作用于线程(因此也包括了 Python 所有常见的多线程限制)。

所以替换使用这两个库异常容易。你可以针对 IO 密集型任务和 CPU 密集型任务来选择不同的库。

原文链接 : http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652563685&idx=2&sn=f563f8913630a4334219ed4a9fa99653&scene=0#wechat_redirect

———————以下为原答案———————————

搜了一下,发现没人说这个。

废话不说,直接上图:

在python中,下滑杠代表上一次运行的结果。不要问我为什么,我也不知道。

这个奇技淫巧是我在查scapy的资料的时候意外发现的,网上关于这个技巧的资料似乎也很少,嗯。(顺便提一下,scapy是个非常强大的库,几乎涵盖了所有网络相关的功能,推荐学习。)

再来说一个吧,关于动态修改代码的。直接上代码:

# socket.py

#

import sys

del sys.modules['socket'] # 从内存中删除当前的socket包

import sys

import time

import logging

import types

path = sys.path[0]

sys.path.pop(0)

import socket # 导入真正的socket包

sys.path.insert(0, path)

# 动态path类方法

def re_class_method(_class, method_name, re_method):

method = getattr(_class, method_name)

info = sys.version_info

if info[0] >= 3: # py2和py3的语法略有不同,需要做下判断。

setattr(_class, method_name,

types.MethodType(lambda *args, **kwds: re_method(method, *args, **kwds), _class))

else:

setattr(_class, method_name,

types.MethodType(lambda *args, **kwds: re_method(method, *args, **kwds), None, _class))

# 动态path实例方法

def re_self_method(self, method_name, re_method):

method = getattr(self, method_name)

setattr(self, method_name, types.MethodType(lambda *args, **kwds: re_method(method, *args, **kwds), self, self))

# 需要修改的类方法

def re_accept(old_method, self, *args, **kwds):

return_value = old_method(self, *args, **kwds)

#do something

return return_value

# 需要修改的实例方法

def re_recvfrom(old_method, self, *args, **kwds):

return_value = old_method(*args, **kwds)

# do something

return return_value

# 需要修改的类方法(无返回值)

def re_bind(old_method, self, *args, **kwds):

re_self_method(self, 'recvfrom', re_recvfrom) #把self实例的recvfrom方法替换成re_recvfrom

#do something

old_method(self, *args, **kwds)

setattr(socket.socket, '_list_client_ip', {}) # 绑定类属性(socket不能动态绑定实例属性,只好绑定类属性了)

re_class_method(socket.socket, 'bind', re_bind) #把socket类的bind方法替换成re_bind

re_class_method(socket.socket, 'accept', re_accept) #把socket类的accept方法替换成re_accept

把上面的代码保存为socket.py,并放入使用了socket的程序的文件夹中,就可以达到动态修改代码的目的。即在不修改库也不修改程序的前提下动态“修改”原有的代码并实现一些功能。

简单来说这段代码实现了两个功能:

1. 劫持库(暂且叫这个名字吧):

因为python会优先导入当前文件夹下的包(不管其他地方是否有同名的包),所以把socket.py文件放入文件夹之后,python自然会导入我们所编写的这个socket.py文件,这等于是劫持了系统中的socket库。

但事情到这里还没有完,如果只是劫持的话socket原有的功能就会失效,所以我们还要导入真正的socket库。

其实导入真正的库之后任务基本就算结束了,我们可以在socket.py文件中做任何想做的事,比如打印一些东西之类的。这样当这个socket文件被导入的时候这些代码就会被执行,但这样做显然还不够,我们还有更高级的玩法!2. 动态修改类方法:

首先获取旧方法并保存,然后编写一个新方法,内容是调用旧方法。之后用setattr方法把类或实例的方法替换成新方法。在得到原方法的结果之后,我们可以选择做一些事,然后再返回结果。说得有点绕,还是看代码好明白一些。

最后,完整的代码在这里:

限制ss客户端数量(基于ip判断),理论上可以用于其他使用了socket模块的python程序。 · GitHub

功能是动态修改socket库,以实现限制客户端数量的目的,代码写的很烂,不喜勿喷。

python绑定句柄容易么_Python 有什么奇技淫巧?相关推荐

  1. python绑定按键pageup键_python游戏教程一——键盘事件

    无论什么游戏,少不了输入设备,键盘鼠标可能应用的是最多的,当然除了他们还有游戏手柄或者其他.今天我们就一起来学习一下经常用到的鼠标和键盘事件. python当中经常用来做游戏的标准库为pygame,今 ...

  2. python必学的模块_Python常用的模块

    模块和包 1.1模块介绍模块定义:一系列功能的集合体 模块使用: import导入模块 或者 from ... import... 导入模块 模块分类:内置模块 自定义模块 第三方模块 模块加载顺序: ...

  3. MLIR Python绑定

    MLIR Python绑定 当前状态:正在开发中,默认情况下未启用 build 前提条件 • 相对较新的Python3安装 • pybind11 必须已安装,可被CMake定位(如果通过进行安装,则会 ...

  4. Ubuntu16下编译安装Open Babel2.4.1和python绑定

    上一篇介绍的是CentOS 7下编译安装Open Babel2.4.1和python绑定点击打开链接 一.Open Babel简介 Open Babel是一款开源自由软件,使用Open Babel可以 ...

  5. CentOS 7下编译安装Open Babel2.4.1和python绑定

    一.Open Babel简介 Open Babel是一款开源自由软件,使用Open Babel可以将一种化学结构类型的文件格式转换成另一种文件格式,非常方便的进行各种类型的化学结构文件进行相互转换. ...

  6. python编辑svg文件_如何使用librsvg Python绑定调整svg映像文件的大小

    当光栅化svg文件时,我希望能够为生成的png文件设置宽度和高度.使用以下代码,仅将画布设置为所需的宽度和高度,具有原始svg文件尺寸的实际图像内容将呈现在(500,600)画布的左上角. impor ...

  7. python log函数怎么打_Python的log日志功能及设置方法

    python log函数怎么打_Python的log日志功能及设置方法_Elaine要当律师的博客-CSDN博客

  8. python判断素数的函数_Python素数prime函数练习_Python源码实操

    Python素数prime函数练习_Python源码实操 素数prime函数练习 1) 写一个函数isprime(x) 判断x是否为素数,如果是素数,返回True,否则返回False def ispr ...

  9. 开发常见错误解决(3)VS2005调试程序出错,绑定句柄无效 Terminal Services

         当我们使用VS2005调试程序时候出错,绑定句柄无效,这个是因为我们没有启动系统终端服务Terminal Services. 解决办法如下: 运行->Services.msc 启动Te ...

最新文章

  1. Docker安装weblogic(五)
  2. 跨平台SSE、AVX指令测试
  3. js调用java代码返回解决方案
  4. 详解 Too many open files
  5. php子类选择器代码,php – 可变产品选择器:获取实时选定值
  6. Docker部署SpringBoot的两种方法,后一种一键部署超好用!
  7. c程序设计语言 hello,Hello, World!
  8. 如何打造一支有超强战斗力的技术团队?
  9. 博图如何上载wincc程序_WINCC 博途 以太网下载方式
  10. MSP430杂谈--IIC通信
  11. kohana php,[php框架]kohana中文译本.pdf
  12. 【转发】 iphone开发随笔,有用的
  13. python编程入门经典-总算理解python编程入门经典教程
  14. CSDN账号 账号设置
  15. 微信公众号查后端服务器IP,微信公众号平台接口开发 获取微信服务器IP地址方法解析...
  16. 关于windows11麦克风声音小的一个bug
  17. myeclipse项目导入eclipse在Web项目下的WebRoot和WebContent
  18. 2022-2028全球智能门锁系统行业调研及趋势分析报告
  19. TweenMax逐帧动画
  20. 工业机器人调运角度_工业机器人的应用案例

热门文章

  1. makefile:5: *** missing separator. Stop.
  2. LEBERT:基于词汇增强的中文NER模型
  3. 连接ebay服务器时系统出现问题,客户端从服务器收到SOAP Fault:验证ebay失败
  4. Leetcode每日一题:108.convert-sorted-array-to-binary-search-tree(有序数组转成BST)
  5. keil编译运行错误,缺少error:#5:#includecore_cm3.h_过路老熊_新浪博客
  6. Go defer实现原理剖析
  7. 文本获取和搜索引擎中的反馈模型
  8. oracle undo数据文件坏,oracle undo数据文件损坏故障处理案例
  9. python2.7更新python3.6_python2.7升级到python3.6注意事项
  10. 费诺编码的gui页面设计_GUI设计和UI设计有什么区别?