自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程菜鸟iglesias的博客

一个编程菜鸟的学习里程

  • 博客(96)
  • 收藏
  • 关注

转载 第十章:使用进程、线程和协程提供并发性-multiprocessing:像线程一样管理进程-确定当前进程

10.4.3 确定当前进程通过传递参数来标识或命名进程很麻烦,也没有必要。每个Process实例都有一个名,可以在创建进程时改变它的默认值。对进程名对于跟踪进程很有用,特别是如果应用中有多种类型的进程在同时运行。import multiprocessingimport timedef worker(): name = multiprocessing.current_process...

2019-04-30 19:03:42 85

转载 第十章:使用进程、线程和协程提供并发性-multiprocessing:像线程一样管理进程-可导入的目标函数

10.4.2 可导入的目标函数threading与multiprocessing例子之间有一个区别,multiprocessing例子中对__main__使用了额外的保护。基于启动新进程的方式,要求子进程能够导入包含目标函数的脚本。可以把应用的主要部分包装在一个__main__检查中,确保模块导入时不会在各个子进程中递归地运行。另一种方法是从一个单独的脚本导入目标函数。例如,multiproce...

2019-04-30 19:01:40 106

转载 第十章:使用进程、线程和协程提供并发性-multiprocessing:像线程一样管理进程-multiprocessing基础

10.4 multiprocessing:像线程一样管理进程multiprocessing模块包含一个API,它基于Threading API,可以把工作划分到多个进程。有些情况下,multiprocessing可以作为临时替换取代threading来利用多个CPU内核,相应地避免Python全局解释器所带来的计算瓶颈。由于multiprocessing与threading模块的这种相似性,这里...

2019-04-30 18:58:50 395

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-线程特定的数据

10.3.11 线程特定的数据有些资源需要锁定以便多个线程使用,另外一些资源则需要保护,以使它们对并非是这些资源的“所有者”的线程隐藏。local()函数会创建一个对象,它能够隐藏值,使其在不同线程中无法被看到。import randomimport threadingimport loggingdef show_value(data): try: val = ...

2019-04-29 21:13:18 95

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-限制资源的并发访问

10.3.10 限制资源的并发访问有时可能需要允许多个工作线程同时访问一个资源,但要限制总数。例如,连接池支持同时连接,但数目可能是固定的,或者一个网络应用可能支持固定数目的并发下载。这些连接就可以使用Semaphore来管理。import loggingimport randomimport threadingimport timeclass ActivePool(): ...

2019-04-29 20:46:03 220

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-同步线程

10.3.9 同步线程除了使用Event,还可以通过使用一个Condition对象来同步线程。由于Condition使用了一个Lock,所以它可以绑定到一个共享资源,允许多个线程等待资源更新。在下一个例子中,consumer()线程要等待设置了Condition才能继续。producer()线程负责设置条件,以及通知其他线程继续。import loggingimport threading...

2019-04-29 20:11:14 104

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-控制资源访问-锁作为上下文管理器

10.3.8.2 锁作为上下文管理器锁实现了上下文管理器API,并与with语句兼容。使用with则不再需要显式地获得和释放锁。import threadingimport loggingdef worker_with(lock): with lock: logging.debug('Lock acquire via with')def worker_no_w...

2019-04-28 18:53:24 91

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-控制资源访问-再入锁

10.3.8.1 再入锁正常的Lock对象不能请求多次,即使是由同一个线程请求也不例外。如果同一个调用链中的多个函数访问一个锁,则可能会产生我们不希望的副作用。import threadinglock = threading.Lock()print('First try :',lock.acquire())print('Second try:',lock.acquire(0))在...

2019-04-28 18:44:04 251

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-控制资源访问

10.3.8 控制资源访问除了同步线程操作,还有一点很重要,要能够控制对共享资源的访问,从而避免破坏或丢失数据。Python的内置数据结构(列表、字典等)是线程安全的。这是Python使用原子字节码来管理这些数据结构的一个副作用(更新过程中不会释放保护Python内部数据结构的全局解释器锁GIL(global Interpreter Lock))。Python中实现的其他数据几个或更简单的类型(...

2019-04-28 18:33:48 148

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-线程间传递信号

10.3.7 线程间传递信号尽管使用多线程的目的是并发地运行单独的操作,但有时也需要在两个或多个线程中同步操作。事件对象是实现线程间安全通信的一种简单方法。Event管理一个内部标志,调用者可以用set()和clear()方法控制这个标志。其他线程可以使用wait()暂停,直到这个标志被设置,可有效地阻塞进程直至允许这些线程继续。import loggingimport threading...

2019-04-28 17:34:57 107

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-定时器线程

10.3.6 定时器线程有时出于某种原因需要派生Thread,Timer就是这样一个例子,Timer也包含在Threading中。Timer在一个延迟之后开始工作,而且可以在这个延迟期间内的任意时刻被取消。import threadingimport timeimport loggingdef delayed(): logging.debug('worker running')...

2019-04-27 09:22:46 108

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-派生线程

10.3.5 派生线程开始时,Thread要完成一些基本初始化,然后调用其run()方法,这会调用传递到构造函数的目标函数,要创建Thread的一个子类,需要覆盖run()来完成所需的工作。import threadingimport loggingclass MyThread(threading.Thread): def run(self): logging...

2019-04-27 09:21:18 134

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-枚举所有线程

10.3.4 枚举所有线程没有必要为所有守护线程维护一个显式句柄来确保它们在退出主进程之前已经完成。enumerate()会返回活动Thread实例的一个列表。这个列表也包括当前线程,由于等待当前线程终止(join)会引入一种死锁情况,所以必须跳过。import randomimport threadingimport timeimport loggingdef worker():...

2019-04-27 09:18:53 104

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-守护与非守护线程

10.3.3 守护与非守护线程到目前为止,示例程序都在隐式地等待所有线程完成工作之后才退出。不过,程序有时会创建一个线程作为守护线程(daemon),这个线程可以一直运行而不阻塞主程序退出。如果一个服务不能很容易地中断线程,或者即使让线程工作到一半时中止也不会造成数据损失或破坏(例如,为一个服务监控工具生成“心跳”的线程),那么对于这些服务,使用守护线程就很有用。要标志一个线程为守护线程,构造线...

2019-04-26 21:27:22 151

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-确定当前线程

10.3.2 确定当前线程使用参数来标识或命名线程很麻烦,也没有必要。每个Thread实例都有一个带有默认值的名,该默认值可以在创建线程时改变。如果服务器进程中有多个服务线程处理不同的操作,那么在这样的服务器进程中,对线程命名就很有用。import threadingimport timedef worker(): print(threading.current_thread(...

2019-04-25 18:43:01 90

转载 第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-Thread对象

10.3 threading:进程中管理并发操作threading模块提供了管理多个线程执行的API,允许程序在同一个进程空间并发地运行多个操作。10.3.1 Thread对象要使用Thread,最简单的方法就是用一个目标函数实例化一个Thread对象,并调用start()让它开始工作。import threadingdef worker(): """thread worker...

2019-04-25 18:40:31 114

转载 第十章:使用进程、线程和协程提供并发性-signal:异步系统事件-信号和线程

10.2.6 信号和线程信号和线程通常不能很好地合作,因为只有进程的主线程可以接收信号。下面的例子建立了一个信号处理器,它在一个线程中等待信号,而从另一个线程发送信号。import signalimport threadingimport osimport timedef signal_handler(num,stack): print('Received signal {}...

2019-04-25 18:02:29 224

转载 第十章:使用进程、线程和协程提供并发性-signal:异步系统事件-忽略信号

10.2.5 忽略信号要忽略一个信号,需要注册SIG_IGN作为处理器。下面这个脚本将SIGINT的默认处理器替换为SIG_IGN,并为SIGUSR1注册一个处理器。然后使用signal.pause()等待接收一个信号。import signalimport osimport timedef do_exit(sig,stack): raise SystemExit('Exiti...

2019-04-24 18:36:14 165

转载 第十章:使用进程、线程和协程提供并发性-signal:异步系统事件-发送信号(闹铃)

10.2.3 发送信号在Python中发送信号的函数是os.kill()。其方法在有关os模块的17.3.10中介绍。10.2.4 闹铃闹铃(alarm)是一种特殊的信号,程序要求操作系统在过去一段时间之后再发出这个信号通知。os的标准模块文档指出,这种方法对于避免一个I/O操作或其他系统调用上的无限阻塞很有用。import signalimport timedef receive...

2019-04-24 18:34:44 162

转载 第十章:使用进程、线程和协程提供并发性-signal:异步系统事件-获取已注册的处理器

10.2.2 获取已注册的处理器要查看为一个信号注册了哪些信号处理器,可以使用getsignal()。要将信号编号作为参数传入。返回值是已注册的处理器,或者是以下某个特殊值:SIG_IGN(如果信号被忽略)、SIG_DFL(如果使用默认行为)或None(如果从C而非从Python注册现有信号处理器)。import signaldef alarm_received(n,stack): ...

2019-04-24 18:32:56 111

转载 第十章:使用进程、线程和协程提供并发性-signal:异步系统事件-接收信号

10.2 signal:异步系统事件信号是一个操作系统特性,它提供了一个途径可以通知程序这里发生了一个事件,并且异步处理这个事件。信号可以由系统本身生成,也可以从一个进程发送到另一个进程。由于信号会中断程序的正常控制流,如果在操作过程中间接收到信号,有些操作(特别是I/O操作)则可能会产生错误。信号由整数标识,在操作系统C首部中定义。Python在signal模块中提供了适合不同平台的多种信号...

2019-04-24 17:35:54 160

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-进程间传递信号

10.1.5 进程间传递信号os模块的进程管理例子演示了如何使用os.fork()和os.kill()在进程间传递信号。由于每个Popen实例提供了一个pid属性,其中包含子进程的进程ID,所以可以完成类似于subprocess的工作。下一个例子结合了两个脚本。这个子进程的USR信号建立了一个信号处理器。# signal_child.pyimport osimport signalim...

2019-04-23 18:57:56 233

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-与其他命令交互

10.1.4 与其他命令交互前面的所有例子都假设交互量是有限的。communicate()方法读取所有输出,返回之前要等待子进程退出。也可以在程序运行时从Popen实例使用的各个管道句柄增量地进行读写。可以用一个简单的应答程序来展示这个技术,这个程序从标准输入读,并写至标准输出。下一个例子中使用脚本repeater.py作为子进程。它从stdin读取,并将值写至stdout,一次处理一行,知道...

2019-04-23 18:05:12 107

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-连接管道段

10.1.3 连接管道段多个命令可以连接一个管线(pipeline),这类似于UNIX shell的做法,即创建单独的Popen实例,把它们的输入和输出串链在一起,一个Popen实例的stdout属性被用作管线中下一个Popen实例的stdin参数,而不是常量PIPE。输出从管线中最后一个命令的stdout句柄读取。import subprocesscat = subprocess.Po...

2019-04-23 17:28:16 114

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-直接处理管道-结合常规和错误输出

10.1.2.4 结合常规和错误输出为了把错误输出从进程定向到标准输出通道,stderr要使用STDOUT而不是PIPE。import subprocessprint('popen4:')proc = subprocess.Popen( 'cat -; echo "to stderr" 1>&2', shell=True, stdin=subproc...

2019-04-22 18:40:58 105

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-直接处理管道-捕获错误输出

10.1.2.3 捕获错误输出还可以监视stdout和stderr数据流,类似于popen3()。import subprocessprint('popen3:')proc = subprocess.Popen( 'cat -; echo "to stderr" 1>&2', shell=True, stdin=subprocess.PIPE, ...

2019-04-22 18:39:42 112

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-直接处理管道-与进程的双向通信

10.1.2.2 与进程的双向通信要建立Popen实例同时完成读写,可以结合使用前面几个技术。import subprocessprint('popen2:')proc = subprocess.Popen( ['cat','-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, )msg = 'thro...

2019-04-22 18:38:00 119

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-直接处理管道-与进程的单向通信

10.1.2 直接处理管道函数run(),call(),check_call()和check_out()都是Popen类的包装器。直接使用Popen可以更多地控制如何运行命令以及如何处理其输入和输出流。例如,通过为stdin,stdout和stderr传递不同的参数,可以模仿不同形式的os.popen()。10.1.2.1 与进程的单向通信要允许一个进程并读取它的所有输出,可以设置stdou...

2019-04-22 18:36:18 102

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-运行外部命令-抑制输出

10.1.1.3 抑制输出在不能显示或捕获输出的情况下,可以使用DEVNULL抑制输出流。下面的例子会同时抑制标准输出和错误流。import subprocesstry: completed =subprocess.run( 'echo to stdout:echo to stderr 1>&2;exit 1', shell=True,...

2019-04-22 17:51:51 97

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-运行外部命令-捕获输出

10.1.1.2 捕获输出对于run()启动的进程,它的标准输入和输出通道会绑定到父进程的输入和输出。这说明调用程序无法捕获命令的输出。可以通过为stdout和stderr参数传入PIPE来捕获输出,以备以后处理。import subprocesscompleted = subprocess.run( ['ls','-1'], stdout = subprocess.PIP...

2019-04-21 20:49:14 111

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-运行外部命令-错误处理

10.1.1.1 错误处理CompletedProcess的returncode属性是程序的退出码。调用者要啊负责解释这个返回值以检测错误。如果run()的check参数为True,则会检查退出码。如果指示发生了一个错误则会产生一个CalledProcessError异常。import subprocesstry: subprocess.run(['false'],check=Tr...

2019-04-21 20:44:40 173

转载 第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-运行外部命令

10.1 subprocess:创建附加进程subprocess模块提供了3个API来处理进程。run()函数是Python 3.5中新增的,作为一个高层API,其用于运行进程并收集它的输出(可选)。函数call(),check_call()和check_output()是从Python2沿袭来的原高层API。这些函数仍受到支持,并在现有的程序中广泛使用。类Popen是一个用于建立其他API的底...

2019-04-20 19:36:30 161

转载 第九章:加密-hmac:密码消息签名与验证-消息签名的应用

运行结果异常,尚未解决

2019-04-19 19:13:12 248

转载 第九章:加密-hmac:密码消息签名与验证-二进制摘要

9.2.3 二进制摘要前面的例子使用hexdigest()方法来生成可打印的摘要。hexdigest是digest()方法计算的值的一个不同表示,这是一个二进制,可以包括不可打印的字符(包括NUL)。有些Web服务(Google checkout、Amazon S3)会使用base64编码版本的二进制摘要而不是hexdigest。import base64import hmacimport...

2019-04-18 21:40:24 219

转载 第九章:加密-hmac:密码消息签名与验证-候选摘要类型

9.2.2 候选摘要类型尽管hmac的默认密码算法是MD5,但这并不是最安全的方法。MD5散列有一些缺点,如冲突(两个不同的消息生成相同的散列)。一般认为SHA1算法更健壮,更建议使用。import hmacimport hashlibdigest_maker = hmac.new( b'secret-shared-key-goes-here', b'', 'sh...

2019-04-18 21:36:10 137

转载 第九章:加密-hmac:密码消息签名与验证-消息签名

9.2 hmac:密码消息签名与验证HMAC算法可以用于验证信息的完整性,这些信息可能在应用之间传递,或者存储在一个可能有安全威胁的地方。基本思想是生成实际数据的一个密码散列,并提供一个共享的秘密密钥。然后使用得到的散列检查所传输或存储的消息,以确定一个信任级别,而不传输秘密密钥。9.2.1 消息签名mew()函数会创建一个新对象来计算消息签名。下面这个例子使用了默认的MD5散列算法。im...

2019-04-18 21:34:27 542

转载 第九章:加密-hashlib:密码散列-增量更新

9.1.6 增量更新散列计算器的update()方法可以反复调用。每次调用时,都会根据提供的附加文本更新摘要。增量更新比将整个文件读入内存更高效,而且能生成相同的结果。import hashlibfrom hashlib_data import loremh = hashlib.md5()h.update(lorem.encode('utf-8'))all_at_once = h.h...

2019-04-17 18:25:10 126

转载 第九章:加密-hashlib:密码散列-按名创建散列

9.1.5 按名创建散列有些情况下,利用字符串指定算法名比直接使用构造器函数更方便。例如,如果能够把散列类型存储在一个配置文件中,这会很有用。在这些情况下,可以使用new()来创建一个散列计算器。import argparseimport hashlibimport sysfrom hashlib_data import loremparser = argparse.Argument...

2019-04-17 18:23:02 96

转载 第九章:加密-hashlib:密码散列-SHA1示例

9.1.4 SHA1示例SHA1摘要也用同样的方式计算。import hashlibfrom hashlib_data import loremh = hashlib.sha1()h.update(lorem.encode('utf-8'))print(h.hexdigest())这个例子中的摘要值有所不同,因为MD5和SHA1算法不同。运行结果:d389ce82bd1a4...

2019-04-17 18:20:50 292

转载 第九章:加密-hashlib:密码散列-MD5示例

9.1.3 MD5示例要为一个数据块(在这里就是转换为一个字节串的Unicode串)计算MD5散列或摘要,首先要创建散列对象,然后增加数据,最后调用digest()或hexdigest()。import hashlibfrom hashlib_data import loremh = hashlib.md5()h.update(lorem.encode('utf-8'))print(...

2019-04-17 18:19:30 378

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除