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()
python的_thread模块来实现多线程(<python核心编程例子>)的更多相关文章
- python函数,模块及eclipse配置python开发环境
一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...
- Python的功能模块[1] -> struct -> struct 在网络编程中的使用
struct模块 / struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在. ...
- python安装mysqlclient模块报fatal error: Python.h:解决方法
在搭建Flask框架安装mysqlclient模块时候老是报fatal error: Python.h:错误,折腾老半天,百度了老半天看了不少大神帖子,就是没解决, 后来发现这不是个BUG,都是自己的 ...
- python多线程与_thread模块
进程与线程 1.进程:计算机程序只是存储在磁盘中的可执行二进制(或其他类型)的文件.只有把他们加载到内存中并被操作系统调用,才具有其生命周期.进程则是一个执行中的程序.每个进程都拥有自己的地址空间,内 ...
- Python学习——struct模块的pack、unpack示例
he struct module includes functions for converting between strings of bytes and native Python data t ...
- 安装python的pip模块
安装python的pip模块 网址https://pypi.python.org/pypi/pip 选择,点击下载 将文件解压到C:\Users\Administrator\AppData\Local ...
- Python学习--Selenium模块
1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台
- Python学习---重点模块的学习【all】
time [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...
- python 之 itertools模块
官方:https://yiyibooks.cn/xx/python_352/library/itertools.html 参考: https://blog.csdn.net/neweastsun/ar ...
随机推荐
- WPS 2019 How To Create New Sheets For Each Row In Excel?
https://www.extendoffice.com/documents/excel/3197-excel-create-new-sheet-for-each-row.html How To C ...
- C语言程序设计--执行命令
1.system函数 1.1函数原型 int system(char *command); 1.2解释 system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来 ...
- Unity3D Shader 按百分比裁剪模型
Shader Shader "Unlit/Disappear" { Properties { _MainTex ("Texture", 2D) = &qu ...
- 【BZOJ5210】最大连通子块和 树剖线段树+动态DP
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...
- twisted 源码分析一:reactor 单例
一个twisted进程只会有一个reactor反应器,下面我们来看看twisted是怎样实现这个单例反应器的, 路径:twisted\internet\reactor.py 主要代码如下: impor ...
- include_once与require_once的区别
①作用及用法 可以减少代码的重复 include(_once)("文件的路径")与require(_once)("文件的路径") ②理解 说白了,就是用包含进 ...
- spark on yarn 无法提交任务问题
java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig spark任务提交出错. 原因: spark ...
- Quartz任务调度实践
最近在写一个任务调度程序,需要每隔几秒查询数据库,并取出数据做一些处理操作.使用到了Quartz任务调度框架. 基本概念 Quartz包含几个重要的对象,分别为任务(Job),触发器(Trigger) ...
- nodejs--get请求数据解析
---- 三种方式解析: 1.自动动手切 2.api的querystring模块 3.api的url模块
- Multi-Database Transaction Demo
public ResultM UploadFile(FileInfoM pFileInfoM) { ResultM result = }; DbModel db = new DbModel(); Db ...