python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具进行总结。

1.多线程

单线程中,如果某一任务(代码块)是long-time running的,则必须等待该任务(代码块)结束,才可以对下一个任务进行操作,为解决long-time 任务的block问题,可将创建多个线程,间隔选择多线程进行操作。python 中多线程常用的库为_thread,threading,其中,_thread为较底层的库,threading 为较高级的库,它们都是将可调用对象传入线程中,进行操作不同的任务。下面分别对这两个库进行简单的总结:

(1)_thread库

(a)创建线程

创建线程为_thread.start_new_thread(func,args),这里func为可调对象,如简单函数,lambda函数,bound方法,args为func中的参数(以元组的形式)。

(b)GIL全局解释器锁(Global interpreter lock)

为解决多线程对全局可变对象的修改等问题,每个线程在运行时,都必须使用(或引用)同一个GIL锁,以保证每个时间点仅有一个线程在运行。_thread库创建GIL为:lock=_thread.allocate_lock(),在进程操作前后分别加上lock.acquare(),lock.release(),或者直接用with打开锁。

(c)与主线程关系

因为主线程结束后,所有子线程全部强行结束,所以一般在主线程上加上time.sleep()方法,或者在主线程中遍历子线程列表集合判定是否所有线程结束来确保所有子线程结束后再结束。

(2)threading库

(a)创建线程

可以一方面:使用类来创建新进程,如下:

class Mythread(threading.Thread):
def __init__(self,myId,count,mutex):
self.myId=myId
self.count=count
self.mutex=mutex
threading.Thread.__init__(self)
def run(self):
for i in range(self.count):
with self.mutex:
print('[%s]=>%s'%(self.myId,i))

通过重写run(),来具体化创建的进程所执行的任务。

另一方面:直接使用。

thread=threading.Thread(target=func,args=(argument,))这里,func是可调对象,argument是func的参数。

(b)启动线程。

与_thread库不同,threading库在创建完线程后,还需要start()来启动。启动后,join()方法可保证子线程全部结束后,主线程再退出。

(c)GIL

有自己的threading.Lock(),一般在执行代码前用with打开。

2.多进程

python 中多进程的库为multiprocess,该库有2个特点:子进程与主进程不共用全局可变变量;所有参数为pickle对象。

(1)创建

一般需要嵌入在if __name__=='__main__':,process=multiprocessing.Process(target=func,args=(argument,))

(2)启动进程

process.start()

process.join()阻塞主进程,直到子进程结束,如果.join()放置于使得子进程函数不能结束的位于主进程的语句前,那么该子进程将永远阻塞主进程。

(3)传递信息和共享状态

该模块自带Queue,Pipe,其中Pipe为双向传递,Queue为多个进程传递,一般为produer,consumer模式。需要注意的是使用Queue时,还需要import queue,以此来捕捉queue.EmptyError,共享状态通过Value,Array

(4)新的程序

可将Process与os.exec*结合起来,如:

"""
Combine multiprocessing.Process with exec* to start independent programs
"""
import os
from multiprocessing import Process
def runprogram(arg):
os.execlp('python','python','child.py',str(arg)) if __name__=='__main__':
for i in range(5):
Process(target=runprogram,args=(i,)).start()
print('parent exits')

而child.py代码如下:

import sys,os,sys

print('\n','version:',sys.version,'Hello from',os.getpid(),sys.argv[1])

运行如下:

version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 5268 2
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 11176 4
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 11380 1
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 876 0
version: 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Hello from 1644 3

基于Windows平台的Python多线程及多进程学习小结的更多相关文章

  1. Python 多线程、多进程 (三)之 线程进程对比、多进程

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...

  2. Python 多线程、多进程 (一)之 源码执行流程、GIL

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  3. Python多线程和多进程谁更快?

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...

  4. MapReduce编程模型详解(基于Windows平台Eclipse)

    本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...

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

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

  6. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  7. python多线程与多进程及其区别

    个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...

  8. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  9. clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

随机推荐

  1. RCTF crypto100(1)

    题面是一个文件,里面是用base64加密的字符串,如下所示: IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI ...

  2. zookeeper logs is missing zookeeper 日志丢失

    ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally Invalid config, exiting abnormal ...

  3. Linux centosVMware 磁盘格式化、磁盘挂载、手动增加swap空间

    一.磁盘格式化 磁盘分区后不能直接使用,需要对每一个分区格式化,格式化其实就是安装系统文件. 命令mke2fs:不支持格式化成xfs系统文件  mkfs.ext4 == mke2fs -t ext4 ...

  4. Hadoop入门概念

    Hadoop作者:Dong Cutting. 受Google三篇论文的启发. 版本: Apache:官方版本 Cloudera:官方版本的封装,优化,打很多patch,商业版本 HortonWorks ...

  5. HttpServletRequest 或 HttpServletResponse显示红色,需引用的依赖包:servlet-api.jar

    解决方法:

  6. stm32_f103使用gcc编译的环境下printf打印函数的实现

    前记   gcc编译使用的printf打印函数需要的底层函数是和其他编译器不同的,以前的是无法使用的,这里有两种方法,一种是使用gcc库里面的printf函数,自己实现底层IO函数_write.另外一 ...

  7. 「SP1043」GSS1 - Can you answer these queries I

    传送门 Luogu 解题思路 这题就是 GSS3 的一个退化版,不带修改操作的区间最大子段和,没什么好讲的. 细节注意事项 咕咕咕 参考代码 #include <algorithm> #i ...

  8. MyEclipse 8.6.1 制作绿色版

    我们先在这个目录下新建一个文件: MyEclipse 10.6.bat , 文件内容如下: start eclipse\eclipse.exe -vm jre\bin\javaw.exe 接下来只需要 ...

  9. tomcat报错catalina.sh: line 401: /usr/java/jdk1.7.52/bin/java: No such file or directory(转)

    原文:https://blog.csdn.net/reblue520/article/details/52588825 将生产服务器的Tomcat目录打包过来后解压后,启动Tomcat后,发现如下问题 ...

  10. vCenter 导入Windows Server 2003/XP自定义规范失败

    1.vcsa 切换到/etc/vmware-vpx/sysprep目录下,会有很多个目录,根据Windows Server 2003的版本,64位找到 svr2003-64 这个目录,32位找到svr ...