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. Pytorch 初次使用nn包

    计算图和autograd是十分强大的工具,可以定义复杂的操作并自动求导:然而对于大规模的网络,autograd太过于底层. 在构建神经网络时,我们经常考虑将计算安排成层,其中一些具有可学习的参数,它们 ...

  2. Hadoop操作经验

    系统日志文件写入到MySQL中,NoSQL中一般存储独立的关联性不大的非业务数据. 单个NameNode也可以恢复,从SecondaryNameNode恢复:两个NameNode是可以做负载均衡:更高 ...

  3. bootstrap如何设置每一个选项卡对应一个页面

    bootstrap选项卡如果直接在每一个选项div中直接插入页面,可以使用<object type="text/html" data="test.html" ...

  4. laravel-url去掉public

    把laravel/server.php改名为index.php 并且将public目录下的.htaccess拷贝到Larvael根目下 Ok了 but why? 自己查去吧

  5. jenkins 2.204.2 安装, 使用国内源安装, 并且跳过插件界面, 更新成国内插件源.

    需要java环境支持,自行百度. jenkins 安装源在国外, 下载会比较慢, 尤其在linux下, 使用yum或者apt install jenkins方式安装时,经常会下载失败. 由于yum或者 ...

  6. Java多线程信号量同步类CountDownLatch与Semaphore

    信号量同步是指在不同线程之间,通过传递同步信号量来协调线程执行的先后次序.CountDownLatch是基于时间维度的Semaphore则是基于信号维度的. 1:基于执行时间的同步类CountDown ...

  7. Masonry与UITableView+FDTemplateLayoutCell搭配使用

    打个小广告:本人开发了一个宠物相关的App,欢迎大家下载体验~ 下载二维码: 进入正文: 之前发过一篇博客,也是对这两个的练习使用,但是之后遇到些问题,所以删除重写了.抱歉 Masonry是一款轻量级 ...

  8. spark动态资源(executor)分配

    spark动态资源调整其实也就是说的executor数目支持动态增减,动态增减是根据spark应用的实际负载情况来决定. 开启动态资源调整需要(on yarn情况下) 1.将spark.dynamic ...

  9. docker 运行ubuntu镜像 apt-get update 问题

    docker运行ubuntu镜像后,apt-getupdate出现问题如下: 根据上面的报错大概是因为....文件上没有生效(生效还需要10d 13h 33min 45s),看来是时间不够啊,需要等待 ...

  10. other#一些问题的列表

    centos7及以后修改hostname, hostnamectl set-hostname centos7 centos7之前修改hostname, vi /etc/sysconfig/networ ...