python3多线程
Posted wd404
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3多线程相关的知识,希望对你有一定的参考价值。
1、线程和进程
计算机资源,指的是cpu计算资源、内存资源、接口读写资源等。
进程:计算机中用于分配资源的最小个体。不同进程之间并不共享内存。
线程:是进程内部的资源分配对象,一个进程最少会有一个线程。同一进程下的不同线程可以共享内存。
2、并行和并发
并行:同一时间段,交替前行。并发:同时发生。
对于单核CPU、早期伪多核CPU、以及某些编程语言而言,实际多线程是并行实现并发效果。
多线程的用处:
(1)对于重复读写端口、等待响应这类程序,可以使用多线程进行并发的操作,提高效率
(2)多线程可以将其他任务放在后台执行,不影响主线程序响应用户操作,尤其是GUI环境
3、模块
python3有__thread和threading两个模块可以分别实现多线程功能。
其中__thread模块是废弃的thread模块的替代,不建议使用,只是为了考虑python3的兼容,功能也较少。所以也不做分析。
threading是推荐使用,支持功能更多。
4、threading模块
4.1 基于继承线程类实现
(1)定义线程类,继承threading.Thread类,将本类对象self通过threading.Thread.__init__方法绑定到线程机制。
(2)定义run方法。run方法具备了线程性质,会被线程类创建的对象调用start方法时启动。
(3)创建线程类对象,可以是多个对象,每个对象都可以通过start方法启动开始执行其run方法
4.2 基于直接创建线程类对象实现
def my_ui_set(self):
self.pushButton_1.clicked.connect(self.listen)
self.workspace_path = \'\'
def listen(self):
thread = threading.Thread(target=self.listen_thread)
thread.start()
def listen_thread(self):
os.system(\'mitmdump -s web_listener_listen.py\')
4.3 模块函数
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
5、threading.Thread类
这是threading模块下的核心类。
5.1 类和初始化
class Thread:
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
group 应该为None,作为未来的扩展当ThreadGroup类被实现
target,指调用的线程方法。如果是继承Thread类,那么实际过程就是调用子类重写的run方法。如果是直接通过Thread初始化,那么需要显式的指定目标方法或函数。
name 线程名称,默认情况下,唯一名称由形式为“Thread-N”,其中N是小的十进制数。
args 是target指向方法调用的参数元组,默认是()
kwargs 是target调用的关键字参数字典,默认是
3、属性
_initialized = False
4、方法
(1)start
启动线程,执行target对应的方法或函数
(2)run
Thread类的子类需要重写该方法,定义线程执行的任务代码
(3)join
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
将当前线程加入到主线程中,即当前线程执行完后不会直接关闭程序,而是由主线程决定
默认的,当线程执行完后,会关闭程序
(4)name
获取设置的name属性,str类型
(5)其他
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。
python循环怎么用多线程去运行
背景:Python脚本:读取文件中每行,放入列表中;循环读取列表中的每个元素,并做处理操作。核心:多线程处理单个for循环函数调用
模块:threading
第一部分:
:多线程脚本 (该脚本只有两个线程,t1循环次数<t2)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
#!/usr/bin/env python#-*- coding: utf8 -*- import sysimport timeimport stringimport threadingimport datetimefileinfo = sys.argv[1] # 读取文件内容放入列表host_list = []port_list = [] # 定义函数:读取文件内容放入列表中def CreateList(): f = file(fileinfo,'r') for line in f.readlines(): host_list.append(line.split(' ')[0]) port_list.append(line.split(' ')[1]) return host_list return port_list f.close() # 单线程 循环函数,注释掉了#def CreateInfo(): # for i in range(0,len(host_list)): # 单线程:直接循环列表# time.sleep(1)# TimeMark = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')# print "The Server's HostName is %-15s and Port is %-4d !!! [%s]" % (host_list[i],int(port_list[i]),TimeMark)# # 定义多线程循环调用函数def MainRange(start,stop): #提供列表index起始位置参数 for i in range(start,stop): time.sleep(1) TimeMark = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print "The Server's HostName is %-15s and Port is %-4d !!! [%s]" % (host_list[i],int(port_list[i]),TimeMark) # 执行函数,生成列表CreateList()# 列表分割成:两部分 mid为列表的index中间位置mid = int(len(host_list)/2) # 多线程部分threads = []t1 = threading.Thread(target=MainRange,args=(0,mid))threads.append(t1)t2 = threading.Thread(target=MainRange,args=(mid,len(host_list)))threads.append(t2) for t in threads: t.setDaemon(True) t.start()t.join()print "ok"
以上是脚本内容!!!
----------------------------------------------------------------------
:读取文件的内容
文件内容:
[root@monitor2 logdb]# cat hostinfo.txt
192.168.10.11 1011
192.168.10.12 1012
192.168.10.13 1013
192.168.10.14 1014
192.168.10.15 1015
192.168.10.16 1016
192.168.10.17 1017
192.168.10.18 1018
192.168.10.19 1019
192.168.10.20 1020
192.168.10.21 1021
192.168.10.22 1022
192.168.10.23 1023
192.168.10.24 1024
192.168.10.25 1025
:输出结果:
单线程 : 执行脚本:输出结果:
[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt
The Server's HostName is 192.168.10.10 and Port is 1010 !!! [2017-01-10 14:25:14]
The Server's HostName is 192.168.10.11 and Port is 1011 !!! [2017-01-10 14:25:15]
The Server's HostName is 192.168.10.12 and Port is 1012 !!! [2017-01-10 14:25:16]
.
.
.
The Server's HostName is 192.168.10.25 and Port is 1025 !!! [2017-01-10 14:25:29]
多线程:执行脚本:输出 结果
[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt
The Server's HostName is 192.168.10.11 and Port is 1011 !!! [2017-01-10 14:51:51]
The Server's HostName is 192.168.10.18 and Port is 1018 !!! [2017-01-10 14:51:51]
The Server's HostName is 192.168.10.12 and Port is 1012 !!! [2017-01-10 14:51:52]
The Server's HostName is 192.168.10.19 and Port is 1019 !!! [2017-01-10 14:51:52]
The Server's HostName is 192.168.10.13 and Port is 1013 !!! [2017-01-10 14:51:53]
The Server's HostName is 192.168.10.20 and Port is 1020 !!! [2017-01-10 14:51:53]
The Server's HostName is 192.168.10.14 and Port is 1014 !!! [2017-01-10 14:51:54]
The Server's HostName is 192.168.10.21 and Port is 1021 !!! [2017-01-10 14:51:54]
The Server's HostName is 192.168.10.15 and Port is 1015 !!! [2017-01-10 14:51:55]
The Server's HostName is 192.168.10.22 and Port is 1022 !!! [2017-01-10 14:51:55]
The Server's HostName is 192.168.10.16 and Port is 1016 !!! [2017-01-10 14:51:56]
The Server's HostName is 192.168.10.23 and Port is 1023 !!! [2017-01-10 14:51:56]
The Server's HostName is 192.168.10.17 and Port is 1017 !!! [2017-01-10 14:51:57]
The Server's HostName is 192.168.10.24 and Port is 1024 !!! [2017-01-10 14:51:57]
The Server's HostName is 192.168.10.25 and Port is 1025 !!! [2017-01-10 14:51:58] 参考技术A import threading
from time import ctime,sleep
def loop(name):
global i
global lock
while i<10:
lock.acquire()
print('thread:',name,' i:',i,' time:',ctime())
i+=1
lock.release()
sleep(1)
i=0
lock=threading.Lock()
threads = []
t1 = threading.Thread(target=loop,args=("t1",))
threads.append(t1)
t2 = threading.Thread(target=loop,args=("t2",))
threads.append(t2)
for t in threads:
t.setDaemon(True)
t.start()
t.join 参考技术B 我想问问看你说的”访问一个站点“是什么意思,是下载一个文件吗?还是需要submit一些表单上去还是其他什么访问法?还有多线程是用来干什么的?是多个线程同时下载一个文件让这个文件可以下载得更快吗?还是其他什么目的?本身python访问web就很简单,urllib的几个函数一调用就好了,不过不清楚你想要做什么,所以我感觉不知道怎么回答你。 参考技术C import threading
def fun1(func):
func.start() #启动线程2
for i in range(5):
print 'x',i
func.join()
fun2()
def fun2():
for i in range(60):
print 'y',i
tfunc2=threading.Thread(target=fun2)
tfunc1=threading.Thread(target=fun1,args=(tfunc2,))
tfunc1.start() #启动线程1本回答被提问者采纳
以上是关于python3多线程的主要内容,如果未能解决你的问题,请参考以下文章