python的_thread模块来实现多线程(<python核心编程例子>)

python中_thread模块是一个低级别的多线程模块,它的问题在于主线程运行完毕后,会立马把子线程给结束掉,不加处理地使用_thread模块是不合适的.这里把书中讲述的有关_thread使用的例子自己实现了一遍,做以记录.

#例子一:自己手动在主线程中设置等待时间import _thread
from time import ctime, sleep

def loop0():
    print("loop0 starts at:{}".format(ctime()))
    sleep(4)
    print("loop0 ends at:{}".format(ctime()))

def loop1():
    print("loop1 starts at:{}".format(ctime()))
    sleep(2)
    print("loop1 ends at:{}".format(ctime()))

if __name__ == "__main__":
    print("start_time:{}".format(ctime()))
    _thread.start_new_thread(loop0, ())
    _thread.start_new_thread(loop1, ())
    #此处设置sleep(6)是因为_thread主线程结束后,会马上杀死其他线程
    sleep(6)
    print("end_time:{}".format(ctime()))
#例子二:通过锁可以实现所有线程全部运行后立即退出import _thread
from time import ctime, sleep

#每个loop等待的时间
wait_time_list = [4, 2]

def loop(i, wait_time, lock):
    """
    根据传入参数创建多个loop函数
    :param i:
    :param wait_time:
    :param lock:
    :return:
    """
    print("loop{} starts at:{}".format(i, ctime()))
    sleep(wait_time)
    print("loop{} ends at:{}".format(i, ctime()))
    #释放锁
    lock.release()

def main():
    print("start_time:", ctime())
    nloops = range(len(wait_time_list))
    locks = []
    #创建锁,上锁
    for i in nloops:
        lock = _thread.allocate_lock()
        lock.acquire()
        locks.append(lock)

    #之所以另起一个循环,是为了尽量保证所有线程能够同时启动,因为上面的循环中锁的操作也要花费一些时间
    for i in nloops:
        _thread.start_new_thread(loop, (i, wait_time_list[i], locks[i]))#loop函数中的参数放到元组里

    #等待所有的子线程释放锁后,结束主线程.(等待时间取决于执行时间最长的子线程,假如第一个子线程执行时间最长,等它执行完毕,下面的循环就不会再进入了.)
    for i in nloops:
        #注意这里locked()要带括号
        while locks[i].locked():
            pass
    print("all done! end_time:", ctime())

if __name__ == ‘__main__‘:
    main()

原文地址:https://www.cnblogs.com/Stephen-Qin/p/10354071.html

时间: 2024-10-08 14:23:27

python的_thread模块来实现多线程(<python核心编程例子>)的相关文章

python核心编程例子3.1

#!/usr/bin/env python # -*- coding:utf-8 -*- 'python核心编程例子3.1:makeTextFile.py -- create text file' import os import sys ls = os.linesep #获取当前平台使用的行终止符.Windows下返回'/r/n',Linux使用'/n'. while True: #按照书的逻辑,此处应该定义个fname,然后循环判断,但是书里没写. fname = raw_input('in

Python的功能模块[1] -&gt; struct -&gt; struct 在网络编程中的使用

struct模块 / struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传递字符串时无需过多担心,但传递 int,char 之类的基本数据时,就需要一种机制将某些特定的结构体类型打包成二进制流的字符串,然后在进行网络传输,而接收端也可以通过某种机制进行解包还原出原始数据.struct 模块便提供了这种机制,该模块主要作用就是对 python 基本类型值与用 python

Python 安装pexpect模块

安装Python 下载pexpect模块:https://pypi.python.org/pypi/pexpect/#downloads 解压后在目录下运行:python ./setup.py install (必须是root权限) 如果没有使用root权限,你只需要把lib的路径放入sys.path,这样便可以使用pexpect import syssys.path.append('pexpect-4.2.1/build/lib') 确认是否安装成功 >>>import pexpect

Python内建模块--collections

python内建模块--collections collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> p = (1, 2) 但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的. 定义一个class又小题大做了,这时,namedtuple就派上了用场: >>> from collections import namedtupl

python 之 itertools模块

官方:https://yiyibooks.cn/xx/python_352/library/itertools.html 参考: https://blog.csdn.net/neweastsun/article/details/51965226 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143200162233153835cfdd1a541a18ddc15059e3d

Python学习——struct模块的pack unpack示例

import struct pack.unpack.pack_into.unpack_from # ref: http://blog.csdn.net/JGood/archive/2009/06/22/4290158.aspx import struct #pack - unpack print print '===== pack - unpack =====' str = struct.pack("ii", 20, 400) print 'str:', str print 'len(

Python学习--Selenium模块

1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台 原文地址:https://www.cnblogs.com/ftl1012/p/seleniumAll.html

基于Python的urllib2模块的多线程网络爬虫程序

1 m Queue import Queue 2 from gzip import GzipFile 3 from StringIO import StringIO 4 import time 5 import socket 6 class ContentEncodingProcessor(urllib2.BaseHandler): 7 """A handler to add gzip capabilities to urllib2 requests ""

Python进阶(三十四)-Python3多线程解读

Python进阶(三十四)-Python3多线程解读 线程讲解 ??多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度. 程序的运行速度可能加快. 在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等. ??线程在执行过程中与进程还是有区别的.每个独立