python两段多线程的例子
记录瞬间
=====================其一=====================
# coding:UTF-8
import os
import threading
from time import ctime def loop(loops, list): # list存放着每个线程需要处理的文本文件名
print('线程 %d 处理的文件列表 %s \n' % (loops + 1, list))
list_len = len(list)
for i in range(list_len):
f = open(list[i], mode="r", encoding="UTF-8")
rows = len(f.readlines()) # 此处,我直接将整个文件读入,所以会比较卡,可以在此设置每次读入的大小
f.close()
print('文件 %s __ %d 行\n' % (list[i], rows)) def main():
print('all start at:', ctime())
cwd = os.getcwd()
dir_list = os.listdir(cwd)
file_list = [] # 该列表用来存放当前目录下的所有txt文件
print('当前文件夹 {} 下的所有txt文件:'.format(dir_list))
for l in dir_list:
if l.rfind('log') >= 0 and os.path.isfile(l):
print(' ', l)
file_list.append(l)
threads = []
threads_num = 4 # 线程数 在此处修改下线程数就可以比较多线程与单线程处理文件的速度差异
print('共有线程数:%d个' % threads_num)
per_thread = len(file_list) / threads_num # 每个线程处理的文本数量
print(per_thread)
for i in range(threads_num):
if threads_num - i == 1: # 最后一个线程,分担余下的所有工作量
t = threading.Thread(target=loop, args=(i, file_list[i * int(per_thread):]))
else:
t = threading.Thread(target=loop, args=(i, file_list[i * int(per_thread):
i * int(per_thread) + int(per_thread)]))
threads.append(t)
for i in range(threads_num):
threads[i].start()
for i in range(threads_num): # 等待所有的线程结束
threads[i].join()
print('all end at:', ctime()) if __name__ == '__main__':
main()
上述代码,主要解决了多线程在进行读写时使用的一些技巧,可以将这段代码引用于写一套文件上,然后将多线程写的文件做以合并。这样可以很好的解决执行速度的问题。
=====================其二=====================
混合使用多进程和多线程的例子。
#!/usr/bin/python
import re
import commands
import time
import multiprocessing
import threading def download_image(url):
print '*****the %s rpm begin to download *******' % url
commands.getoutput('wget %s' % url) def get_rpm_url_list(url):
commands.getoutput('wget %s' % url)
rpm_info_str = open('index.html').read() regu_mate = '(?<=<a href=")(.*?)(?=">)'
rpm_list = re.findall(regu_mate, rpm_info_str) rpm_url_list = [url + rpm_name for rpm_name in rpm_list]
print 'the count of rpm list is: ', len(rpm_url_list)
return rpm_url_list
基础方法定义 =↑=
def multi_thread(rpm_url_list):
threads = []
# url = 'https://mirrors.ustc.edu.cn/centos/7/os/x86_64/Packages/'
# rpm_url_list = get_rpm_url_list(url)
for index in range(len(rpm_url_list)):
print 'rpm_url is:', rpm_url_list[index]
one_thread = threading.Thread(target=download_image, args=(rpm_url_list[index],))
threads.append(one_thread) thread_num = 5 # set threading pool, you have put 4 threads in it
while 1:
count = min(thread_num, len(threads))
print '**********count*********', count ###25,25,...6707%25 res = []
for index in range(count):
x = threads.pop()
res.append(x)
for thread_index in res:
thread_index.start() for j in res:
j.join() if not threads:
break
多线程的定义 =↑=
def multi_process(rpm_url_list):
# process num at the same time is 4
process = []
rpm_url_group_0 = []
rpm_url_group_1 = []
rpm_url_group_2 = []
rpm_url_group_3 = [] for index in range(len(rpm_url_list)):
if index % 4 == 0:
rpm_url_group_0.append(rpm_url_list[index])
elif index % 4 == 1:
rpm_url_group_1.append(rpm_url_list[index])
elif index % 4 == 2:
rpm_url_group_2.append(rpm_url_list[index])
elif index % 4 == 3:
rpm_url_group_3.append(rpm_url_list[index])
rpm_url_groups = [rpm_url_group_0, rpm_url_group_1, rpm_url_group_2, rpm_url_group_3]
for each_rpm_group in rpm_url_groups:
each_process = multiprocessing.Process(target = multi_thread, args = (each_rpm_group,))
process.append(each_process) for one_process in process:
one_process.start() for one_process in process:
one_process.join() # for each_url in rpm_url_list:
# print '*****the %s rpm begin to download *******' %each_url
#
# commands.getoutput('wget %s' %each_url)
多进程调用多线程的定义 =↑=
def main():
url = 'https://mirrors.ustc.edu.cn/centos/7/os/x86_64/Packages/'
url_paas = 'http://mirrors.ustc.edu.cn/centos/7.3.1611/paas/x86_64/openshift-origin/'
url_paas2 ='http://mirrors.ustc.edu.cn/fedora/development/26/Server/x86_64/os/Packages/u/' start_time = time.time()
rpm_list = get_rpm_url_list(url_paas)
print multi_process(rpm_list)
# print multi_thread(rpm_list)
#print multi_process()
# print multi_thread(rpm_list)
# for index in range(len(rpm_list)):
# print 'rpm_url is:', rpm_list[index]
end_time = time.time()
print 'the download time is:', end_time - start_time print main()
主方法 =↑=
代码来源:https://blog.csdn.net/nfzhlk/article/details/76946281
其中获取cpu核数的方法可以使用
from multiprocessing import cpu_count
print(cpu_count())
一般地,想要多线程快速做事情,我们不加锁,加了锁后,容易导致执行的效率跟单线程保持一致了。
这样做不划算,当然要看具体的需求是否需要使用多线程加锁的方式。
python两段多线程的例子的更多相关文章
- 如何把Excel表暴力拆分了,python两段代码帮你搞定
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:老方玩编程 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...
- python多线程简单例子
python多线程简单例子 作者:vpoet mail:vpoet_sir@163.com import thread def childthread(threadid): print "I ...
- python高级之多线程
python高级之多线程 本节内容 线程与进程定义及区别 python全局解释器锁 线程的定义及使用 互斥锁 线程死锁和递归锁 条件变量同步(Condition) 同步条件(Event) 信号量 队列 ...
- python之路-----多线程与多进程
一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...
- 2016/1/2 Python中的多线程(1):线程初探
---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...
- python并发编程&多线程(二)
前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...
- Python多进程与多线程编程及GIL详解
介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- python中的多线程【转】
转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...
随机推荐
- Innodb与Myisam引擎的区别与应用场景
1. 区别: (1)事务处理: MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理): (2)锁机制不同: MyISAM是表级锁,而InnoDB是行级锁: (3)sel ...
- 还不知道spring的RestTemplate的妙用吗
为什么要使用RestTemplate? 随着微服务的广泛使用,在实际的开发中,客户端代码中调用RESTful接口也越来越常见.在系统的遗留代码中,你可能会看见有一些代码是使用HttpURLConnec ...
- ListView 上拉加载更多
ListView 上拉加载更多 首先来个效果图 界面布局 <?xml version="1.0" encoding="utf-8"?> <Re ...
- Matrix [POJ3685] [二分套二分]
Description 有一个N阶方阵 第i行,j列的值Aij =i2 + 100000 × i + j2 - 100000 × j + i × j,需要找出这个方阵的第M小值. Input 第一行输 ...
- HTML5_canvas_pen.translate()_
.save() 和 .restore() 除了会保存之前的样式,还会保存之前的坐标轴 pen.translate(x, y); 将画布的 坐标轴原点(0, 0) 从画布的左上角,移动到 (x, y) ...
- mobile_基础事件
DOM0 级事件模型(模拟器不支持) DOM0 级事件绑定 在 移动端有 300ms 的延迟 ontouchstart 手指按下事件 ontouchmove 手指移动事件 pntouchend 手指离 ...
- Java for Android 学习第一周
前言 专业Java程序员所必需掌握的3个主题: 1. Java编程语言 2. 使用Java的面向对象编程(OOP) 3. Java核心库 JDK.JRE和JVM 1. javac编译java源代码为字 ...
- XP下ubuntu双系统安装方法
利用u盘将iso刻录 从u盘启动 连续按alt+f2 进入ubuntu试用 打开终端 输入 sudo umount -l /cdrom sudo umount -l /isodevice 然后安装un ...
- ReactJS antd 环境中项目上传图片后压缩(lrz的使用)
lrz说明 ( github地址 :https://github.com/think2011/localResizeIMG ) 用于:在客户端压缩好要上传的图片可以节省带宽更快的发送给后端,特别适合在 ...
- 天梯赛练习题L2-006. 树的遍历
题目链接 已知一棵树的后序遍历顺序和中序遍历顺序,求层次遍历的顺序: 树的四种遍历: 先序遍历:先访问根节点,再访问左子树,最后访问右子树 中序遍历:先访问左子树,再访问根节点,最后访问右子树 后序遍 ...