Python并行编程(二):基于线程的并行

dukuan 2018-10-10 原文

Python并行编程(二):基于线程的并行

1、介绍

      软件应用中使用最广泛的并行编程范例是多线程。通常一个应用有一个进程,分成多个独立的线程,并行运行、互相配合,执行不同类型的任务。

      线程是独立的处理流程,可以和系统的其他线程并行或并发地执行。多线程可以利用共享内存空间共享数据和资源。线程和进程的具体实现取决于你要运行的操作系统,但是总体来讲,我们可以说线程是包含在进程中的,同一个进程的多个不同的线程可以共享相同的资源,而进程之间不会共享资源。

      每一个线程基本上包含3个元素:程序计数器,寄存器和栈。与同一进程的其他线程共享的资源基本上包括数据和系统资源。每一个线程也有自己的运行状态,可以和其他线程同步,线程的状态大体上可以分为ready,running,blocked。线程的典型应用是应用软件的并行化,目的是为了充分利用现代的多核处理器,使每个核心可以运行单个线程。相比于进程,使用线程的优势主要是性能,相比之下,在进程之间切换上下文要比在统一进程的多线程之间切换上下文要重的多。

 

2、定义一个线程

      使用线程最简单的方式是用一个目标函数实例化一个Thread然后调用start()方法启动它。Python的threading模块提供了Thread()方法在不同的线程中运行函数或处理过程等。

      class threading.Thread(group=None,  target=None, name=None, args=(), kwargs={})

      – group:特性预留

      – target:当线程启动的时候要执行的函数

      – name:线程的名字,默认为Thread-N

      – args:传递给target的参数,要试用tuple类型

      – kwargs:同上,试用字段类型dict

      线程代码用例:

import threading

def function(i):
    print("I am thread-%s" %i)
    return

threads = []

for i in range(5):
    t = threading.Thread(target=function, args=(i,))
    threads.append(t)
    t.start()
    t.join()

      t.join:主线程会调用t线程,然后等待t线程完成再执行for循环开启下一个t线程。可理解为阻塞主线程。

 

3、确认一个线程

      使用参数来确认或命名线程是没有必要的,每一个Thread实例创建的时候都有一个带默认值的名字,并且可以修改。在服务端通常一个服务进程都有多个线程服务,负责不同的操作,这时候命名线程是很实用的。

      自定义线程名称用例:

import threading
import time

def first_function():
    print("%s is starting" %threading.currentThread().getName())
    time.sleep(2)
    print("%s is exiting" %threading.currentThread().getName())

def second_function():
    print("%s is starting" %threading.currentThread().getName())
    time.sleep(2)
    print("%s is exiting" %threading.currentThread().getName())

def third_function():
    print("%s is starting" %threading.currentThread().getName())
    time.sleep(2)
    print("%s is exiting" %threading.currentThread().getName())

if __name__ == "__main__":
    t1 = threading.Thread(name='first_function', target=first_function)
    t2 = threading.Thread(name='second_function', target=second_function)
    t3 = threading.Thread(name='third_function', target=third_function)

    t1.start()
    t2.start()
    t3.start()

    t1.join()
    t2.join()
    t3.join()

      运行结果:

      

 

      如果不自定义名称如下:

import threading
import time

def first_function():
    print("%s is starting" %threading.currentThread().getName())
    time.sleep(2)
    print("%s is exiting" %threading.currentThread().getName())

def second_function():
    print("%s is starting" %threading.currentThread().getName())
    time.sleep(2)
    print("%s is exiting" %threading.currentThread().getName())

def third_function():
    print("%s is starting" %threading.currentThread().getName())
    time.sleep(2)
    print("%s is exiting" %threading.currentThread().getName())

if __name__ == "__main__":
    # t1 = threading.Thread(name='first_function', target=first_function)
    # t2 = threading.Thread(name='second_function', target=second_function)
    # t3 = threading.Thread(name='third_function', target=third_function)

    t1 = threading.Thread(target=first_function)
    t2 = threading.Thread(target=second_function)
    t3 = threading.Thread(name='third_function', target=third_function)

    t1.start()
    t2.start()
    t3.start()

    t1.join()
    t2.join()
    t3.join()

      运行结果:

      

 

4、使用线程

      在子类中实现线程:

import threading
import time

exit_flag = 0

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter

    def run(self):
        print("Starting %s" %self.name)
        print_time(self.name, self.counter, 5)
        print("Exiting %s" %self.name)
def print_time(threadName, delay, counter):
    while counter:
        if exit_flag:
            import _thread
            _thread.exit()
        time.sleep(delay)
        print("%s:%s" %(threadName, time.ctime(time.time())))
        counter -= 1
# 创建实例
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

thread1.start()
thread2.start()

thread1.join()
thread2.join()
print("Exiting Main Thread")

      运行结果如下:

      

      线程模块是创建和管理线程的首选形式。每一个线程都通过一个集成Thread的子类代表,覆盖run()方法来实现逻辑,这个方法是线程的入门,执行start()即调用此方法。

 

发表于 2018-10-10 11:54 杜先生的博客 阅读() 评论() 编辑 收藏

 

版权声明:本文为dukuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dukuan/p/9759822.html

Python并行编程(二):基于线程的并行的更多相关文章

  1. 我的Python之旅第三天

    我的Python之旅第三天 一 编码操作 1 编码 enconde() 英文字符编码为”utf-8 […]...

  2. Python小白学习之路(二十一)—【迭代器】

    迭代器 1.迭代器协议 对象必须提供一个 next 方法,执行该方法要么返回迭代中的下一项,要么就引起一个St […]...

  3. 小白学 Python 爬虫(29):Selenium 获取某大型电商网站商品信息

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫 […]...

  4. python _、__和__xx__的区别

    python _、__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家。英文原文地址 […]...

  5. python学习 -xpath定位

    XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。一、XPATH定位---常用归纳定位说明//ul/*ul的所...

  6. Python常用数据结构之collections模块

    Python数据结构常用模块:collections、heapq、operator、itertools col […]...

  7. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错 […]...

  8. Python – 开发短视频资讯平台作业

    目录 需求 分页示例代码 示例代码 video.csv 返回Python目录 需求 需求参考 有video.c […]...

随机推荐

  1. 前端Q的小小小里程碑

    很多关注我的人都不太了解前端Q这个名字的由来,这篇文章就来讲讲前端Q的前世今生,顺便送大大福利(文末有惊喜), […]...

  2. win7 安装 sharepoint 服务器场模式,解决未能加载文件或程序集 Microsoft.IdentityModel, Version 3.5.0.0 – liuyuhua

    win7 安装 sharepoint 服务器场模式,解决未能加载文件或程序集 Microsoft.Identi […]...

  3. 交换机基于接口划分VLAN(汇聚层设备作为网关)

    组网图形  简介 划分VLAN的方式有:基于接口、基于MAC地址、基于IP子网、基于协议、基于策略(MAC地址 […]...

  4. 写完批处理脚本,再写个Gradle脚本,解放双手

    前言 上一篇写个批处理来帮忙干活—遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们 […]...

  5. MySQL replace into那些隐藏的风险 – Jia-Xin

    MySQL replace into那些隐藏的风险 目录 replace into时存在主键冲突 replac […]...

  6. 微信支付开发实记

    微信支付分为JSAPI支付,扫码支付,APP支付,小程序支付等不同的支付方式。但大体的支付过程是一致的,本文以 […]...

  7. 迁移学习resnet

    1 import torch 2 import numpy as np 3 import torchvisio […]...

  8. 前后端分离项目

    以前的项目:博客系统这个项目是传统的开发方式,没有实现前后端分离。比较简单,没有跨域等问题。在传统的开发方式中 […]...

展开目录

目录导航