Python多线程编程(二):启动线程的两种方法

在Python中我们主要是通过thread和threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用threading模块实现多线程编程。一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。

将函数传递进Thread对象

代码如下:

''' 
Created on 2012-9-5 
 
@author:  walfred
@module: thread.ThreadTest1 
@description:
'''   
import threading 
 
def thread_fun(num): 
    for n in range(0, int(num)): 
        print " I come from %s, num: %s" %( threading.currentThread().getName(), n) 
 
def main(thread_num): 
    thread_list = list(); 
    # 先创建线程对象 
    for i in range(0, thread_num): 
        thread_name = "thread_%s" %i 
        thread_list.append(threading.Thread(target = thread_fun, name = thread_name, args = (20,))) 
 
    # 启动所有线程    
    for thread in thread_list: 
        thread.start() 
 
    # 主线程中等待所有子线程退出 
    for thread in thread_list: 
        thread.join() 
 
if __name__ == "__main__": 
    main(3)

程序启动了3个线程,并且打印了每一个线程的线程名字,这个比较简单吧,处理重复任务就派出用场了,下面介绍使用继承threading的方式;

继承自threading.Thread类

代码如下:

'''
Created on 2012-9-6
 
@author: walfred
@module: thread.ThreadTest2
''' 
 
import threading 
 
class MyThread(threading.Thread): 
    def __init__(self): 
        threading.Thread.__init__(self); 
 
    def run(self): 
        print "I am %s" %self.name 
 
if __name__ == "__main__": 
    for thread in range(0, 5): 
        t = MyThread() 
        t.start()

接下来的文章,将会介绍如何控制这些线程,包括子线程的退出,子线程是否存活及将子线程设置为守护线程(Daemon)。

(0)

相关推荐

  • 浅析Python多线程下的变量问题

    在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: def process_student(name): std = Student(name) # std是局部变量,但是每个函数都要用它,因此必须传进去: do_task_1(std) do_task_2(std) def do_task_1(std): do_subtask

  • python多线程http下载实现示例

    测试平台 Ubuntu 13.04 X86_64 Python 2.7.4 花了将近两个小时, 问题主要刚开始没有想到传一个文件对象到线程里面去, 导致下载下来的文件和源文件MD5不一样,浪费不少时间. 有兴趣的同学可以拿去加上参数,改进下, 也可以加上断点续传. 复制代码 代码如下: # -*- coding: utf-8 -*-# Author: ToughGuy# Email: wj0630@gmail.com# 写这玩意儿是为了初步了解下python的多线程机制# 平时没写注释的习惯,

  • Python 多线程实例详解

    Python 多线程实例详解 多线程通常是新开一个后台线程去处理比较耗时的操作,Python做后台线程处理也是很简单的,今天从官方文档中找到了一个Demo. 实例代码: import threading, zipfile class AsyncZip(threading.Thread): def __init__(self, infile, outfile): threading.Thread.__init__(self) self.infile = infile self.outfile =

  • Python threading多线程编程实例

    Python 的多线程有两种实现方法: 函数,线程类 1.函数 调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么 复制代码 代码如下: # -*- coding: utf-8 -*- import thread def f(name):   #定义线程函数   print "this is " + name   if __name__ == '__main__':   thread.start_new_thread(f

  • Python使用代理抓取网站图片(多线程)

    一.功能说明:1. 多线程方式抓取代理服务器,并多线程验证代理服务器ps 代理服务器是从http://www.cnproxy.com/ (测试只选择了8个页面)抓取2. 抓取一个网站的图片地址,多线程随机取一个代理服务器下载图片二.实现代码 复制代码 代码如下: #!/usr/bin/env python#coding:utf-8 import urllib2import reimport threadingimport timeimport random rawProxyList = []ch

  • Python多线程、异步+多进程爬虫实现代码

    安装Tornado 省事点可以直接用grequests库,下面用的是tornado的异步client. 异步用到了tornado,根据官方文档的例子修改得到一个简单的异步爬虫类.可以参考下最新的文档学习下. pip install tornado 异步爬虫 #!/usr/bin/env python # -*- coding:utf-8 -*- import time from datetime import timedelta from tornado import httpclient, g

  • python多线程编程方式分析示例详解

    在Python多线程中如何创建一个线程对象如果你要创建一个线程对象,很简单,只要你的类继承threading.Thread,然后在__init__里首先调用threading.Thread的__init__方法即可 复制代码 代码如下: import threading  class mythread(threading.Thread):  def __init__(self, threadname):  threading.Thread.__init__(self, name = thread

  • Python多线程编程(二):启动线程的两种方法

    在Python中我们主要是通过thread和threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用threading模块实现多线程编程.一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行:另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里. 将函数传递进Thread对象 复制代码 代码如下: '''  Cr

  • Java创建和启动线程的两种方式实例分析

    本文实例讲述了Java创建和启动线程的两种方式.分享给大家供大家参考,具体如下: 方式1:继承Thread类 步骤: 1):定义一个类A继承于java.lang.Thread类. 2):在A类中覆盖Thread类中的run方法. 3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体. 4):在main方法(线程)中,创建线程对象,并启动线程. (1)创建线程类对象: A类 a = new A类(); (2)调用线程对象的start方法: a.start();//启动一个线程

  • Python识别二维码的两种方法详解

    目录 前言 pyzbar + PIL cv2 前言 最近在搜寻资料时,发现了一则10年前的新闻:二维码将成线上线下关键入口.从今天的移动互联网来看,支付收款码/健康码等等与我们息息相关,二维码确实成为了我们生活中不可或缺的一部分. 在学习Python处理二维码的过程中,我们看到的大多是“用python生成酷炫二维码”.“用Python制作动图二维码”之类的文章.而关于使用Python批量识别二维码的教程,并不多见.所以今天我会给大家分享两种批量识别二维码的Python技巧! pyzbar + P

  • java创建线程的两种方法区别

    在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口. 下面通过两个例子来分析两者的区别: 1)继承Thread类 public class TestThread extends Thread { int count = 3; public TestThread(String ThreadName) { super(ThreadName); } @Override public void run() { for (int i = 0; i < 10; i++) if

  • Java创建子线程的两种方法

    摘要: 其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的. 一.继承Thread线程类: 通过继承Thread类,重写run方法,子类对象就可以调用start方法启动线程,JVM就会调用此线程的run方法. 代码如下: public class MyThread extends Thread { public MyThread() { super(); } @Override public void run() { } // 线程执行结束

  • 使用Python实现租车计费系统的两种方法

    要求: #出租车计费************************************************************************************** # 要求:循环输入公里数,自动计算所需费用,费用计算公式如下 # 0.公里数小于等于0时输出: #   请输入正确的公里数进行计算,程序结束 # 1.出租车起步价8元,包含2公里 # 2.超过两公里的部分,每公里收取1.2元 # 3.超过12公里的部分,每公里收取1.5元 方法一: while True:

  • python实现嵌套列表平铺的两种方法

    方法一:使用列表推导式 >>> vec = [[1,2,3],[4,5,6],[7,8,9]] >>> get = [num for elem in vec for num in elem] >>> get [1, 2, 3, 4, 5, 6, 7, 8, 9] 方法相当于 >>> vec = [[1,2,3],[4,5,6],[7,8,9]] >>> result = [] >>> for ele

  • Python爬虫后获取重定向url的两种方法

    下面给大家分享Python爬虫后获取重定向url的两种方法,具体内容如下所示: 方法(一) # 获得重定向url from urllib import request # https://zhidao.baidu.com/question/681501874175782812.html url = "https://www.baidu.com/link?url=IscBx0u8h9q4Uq3ihTs_PqnoNWe7slVWAd2dowQKrnqJedvthb3zrh9JqcMJu3ZqFrbW

  • Python创建相同值数组/列表的两种方法

    目录 题目要求 解决方法 方法一:使用Python基础语法 方法二:使用numpy包的函数实现 参考资料 总结 题目要求 现在有这样的一个需求:创建一个数组或列表,列表中的所有值是相同的. 解决方法 找到两种解决方法,第一种是使用Python的基础语法,第二种是借助numpy包提供的函数实现.分别为大家进行介绍. 方法一:使用Python基础语法 使用“*”号可以实现列表的创建,使用非常简单,以下示例将会创建长度为20的列表. 另外,不仅可以复制单个元素,还可以实现多个元素的复制,如下示例: 方

  • Java编程求二叉树的镜像两种方法介绍

    给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像. 仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤.这两棵树的根节点相同,但他们的左右两个子节点交换了位置.因此我们不妨先在树中交换根节点的两个子节点,就得到了下面一幅图中的第二颗树 解法1(递归) 思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理. /*class TreeNode{ int val; TreeNode left=null; TreeNode right=null;

随机推荐