python模块介绍-threading: 线程 管理并发操作

定义线程

最简单的方法:使用target指定线程要执行的目标函数,再使用start()启动。

语法:

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

group恒为None,保留未来使用。target为要执行的函数名。name为线程名,默认为Thread-N,通常使用默认即可。但服务器端程序线程功能不同时,建议命名。

#!/usr/bin/env python3
# coding=utf-8
import threading

def function(i):
    print ("function called by thread {0}".format(i))
threads = []

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

执行结果:

$ ./threading_define.py 
function called by thread 0
function called by thread 1
function called by thread 2
function called by thread 3
function called by thread 4

确定当前线程

#!/usr/bin/env python3
# coding=utf-8

import threading
import time

def first_function():
    print (threading.currentThread().getName()+ str(‘ is Starting \n‘))
    time.sleep(3)
    print (threading.currentThread().getName()+ str( ‘ is Exiting \n‘))
    
def second_function():
    print (threading.currentThread().getName()+ str(‘ is Starting \n‘))
    time.sleep(2)
    print (threading.currentThread().getName()+ str( ‘ is Exiting \n‘))
    
def third_function():
    print (threading.currentThread().getName()+    str(‘ is Starting \n‘))
    time.sleep(1)
    print (threading.currentThread().getName()+ str( ‘ is Exiting \n‘))
    
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()

执行结果:

$ ./threading_name.py 
first_function is Starting 
second_function is Starting 
third_function is Starting 
third_function is Exiting 
second_function is Exiting 
first_function is Exiting

配合logging模块一起使用:

#!/usr/bin/env python3
# coding=utf-8

import logging
import threading
import time

logging.basicConfig(
    level=logging.DEBUG,
    format=‘[%(levelname)s] (%(threadName)-10s) %(message)s‘,
    )
    
def worker():
    logging.debug(‘Starting‘)
    time.sleep(2)
    logging.debug(‘Exiting‘)
    
def my_service():
    logging.debug(‘Starting‘)
    time.sleep(3)
    logging.debug(‘Exiting‘)
    
t = threading.Thread(name=‘my_service‘, target=my_service)
w = threading.Thread(name=‘worker‘, target=worker)
w2 = threading.Thread(target=worker) # use default name
w.start()
w2.start()
t.start()

执行结果:

$ ./threading_names_log.py[DEBUG] (worker    ) Starting
[DEBUG] (Thread-1  ) Starting
[DEBUG] (my_service) Starting
[DEBUG] (worker    ) Exiting
[DEBUG] (Thread-1  ) Exiting
[DEBUG] (my_service) Exiting

在子类中使用线程

前面我们的线程都是结构化编程的形式来创建。通过集成threading.Thread类也可以创建线程。Thread类首先完成一些基本上初始化,然后调用它的run()。run()方法会会调用传递给构造函数的目标函数。

#!/usr/bin/env python3
# coding=utf-8

import logging
import threading
import time

exitFlag = 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 " + self.name)
        print_time(self.name, self.counter, 5)
        print ("Exiting " + self.name)
        
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print ("%s: %s" %(threadName, time.ctime(time.time())))
        counter -= 1
        
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print ("Exiting Main Thread")

执行结果:

$ ./threading_subclass.py 
Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Tue Sep 15 11:03:21 2015
Thread-2: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:23 2015
Thread-2: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:25 2015
Exiting Thread-1
Thread-2: Tue Sep 15 11:03:26 2015
Thread-2: Tue Sep 15 11:03:28 2015
Thread-2: Tue Sep 15 11:03:30 2015
Exiting Thread-2
时间: 2024-10-31 08:20:19

python模块介绍-threading: 线程 管理并发操作的相关文章

Python3标准库:threading进程中管理并发操作

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

python 模块介绍 - Base16, Base32, Base64 数据编码

简介 功能:RFC 3548: Base16, Base32, Base64 数据编码.转换二进制数据为适合明文协议传输的 ASCII 序列.转换8bits 为每个字节包含 6,5 或 4bits 的有效数据,比如 SMTP, URL 的一部分或者 HTTP POST 的一部分.参考:RFC 3548.编码算法不同于 uuencode.类型:标准库相关模块:uu, binhex, uu, quopri Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法.由于 2 的 6 次方

python模块介绍

adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:连接MySQL数据库的py2exe:用来生成windows可执行文件Pylons:我们领导推荐的web frameworkpysql

python模块介绍- SocketServer 网络服务框架

来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer.这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步. 创建服务器的步骤.首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()

python模块介绍- multi-mechanize 通用的性能测试工具

简介 Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务).测试输出报告保存为HTML或JMeter的兼容的XML.Multi-Mechanize最常用于web性能和可扩展性(scalability)测试,也适用于任何python可以访问的API.尤其适合后台性能测试.稍微懂点编程的话,这个工具会远强过商业的性能测试工具. 主要特性: 支持各种 HTTP methods 高级超链接和HTML表单支持 支持 SSL 自

python模块介绍-webbrowser:方便的web浏览器控制器

源码:Lib/webbrowser.py 简介 webbrowser模块提供了展示基于web文档的高层接口.多数情况下, 简单地调用open() 函数即可. 在Unix的X11下,首选调用图形浏览器.如果图形浏览器不可用或者没有显示终端,则使用文本模式浏览器 .如果使用文本模式浏览器, 在用户退出浏览器之前调用进程都会阻塞. 如果设置了BROWSER环境变量,它将覆盖平台默认的浏览器列表. BROWSER是os.pathsep分割的的浏览器列表.如果列表的部分值包含字符串"%s",解析

python模块介绍-requests:人性化的HTTP

目录 人性化的HTTP Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 在Python的世界里,事情不应该这么麻烦. 线程对象 最简单的方法:使用target指定线程要执行的目标函数,再使用start()启

python模块介绍- binascii 二进制和ASCII转换

简介 binascii模块包含很多用来方法来转换二进制和各种ASCII编码的二进制表示法.通常不直接使用这些功能,而是使用封装模块,如uu, base64或binhex.binascii模块包含用C语言编写更快的低级功能,通常为高级模块所使用. 功能:二进制和ASCII转换. 类型:标准模块 相关模块: base64 标准模块. binhex 标准模块. uu        标准模块. quopri  标准模块. Uu编码 uu编码格式现在已经比较少使用(http://zh.wikipedia.

python模块介绍-Tornado:Tornado中文文档-概述

快速链接 tornado-4.1.tar.gz, tornado最新版本 tornado源码@github 邮件列表:讨论.最新公告 tornado@stackoverflow tornado wiki tornado bug跟踪 快速入门 import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler):     def get(self):         self.write("He