Python 多线程学习

个人总结创建多线程步骤:

1. import threading

2. 创建线程列表 threads = []

3. 开辟线程 t1 = threading.Thread(…………) 这里注意用args传参是个元组

4. for t in threads循环线程列表,在循环体中用t.setDaemon(True)设置为守护线程后,如果不设置为守护线程程序会被无限挂起,在调用t.start()开始

5. 在for循环外用t.jion()阻塞父线程

class threading.Thread()说明:

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

This constructor should always be called with keyword arguments. Arguments are:

  group should be None; reserved for future extension when a ThreadGroup class is implemented.

  target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.

  name is the thread name. By default, a unique name is constructed of the form “Thread-N” where N is a small decimal number.

  args is the argument tuple for the target invocation. Defaults to ().  注意这里是个元组

  kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.

If the subclass overrides the constructor, it must make sure to invoke the base class constructor (Thread.__init__()) before doing

anything else to the thread.

程序1:

 1 #coding=utf-8
 2 import threading #导入threading包
 3 from time import sleep,ctime
 4 import time
 5
 6 def task1():
 7     print ("Task 1 executed at %s\n" %ctime())
 8     sleep(3)
 9
10 def task2():
11     print ("Task 2 executed %s\n" %ctime())
12     sleep(5)
13
14 print("多线程:")
15 starttime=time.time(); #记录开始时间
16 threads = [] #创建一个线程列表,用于存放需要执行的子线程
17 t1 = threading.Thread(target=task1) #创建第一个子线程,子线程的任务是调用task1函数,注意函数名后不能有()
18 threads.append(t1)#将这个子线程添加到线程列表中
19 t2 = threading.Thread(target=task2)#创建第二个子线程
20 threads.append(t2)#将这个子线程添加到线程列表中
21
22 for t in threads: #遍历线程列表
23     t.setDaemon(True) #将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起
24     t.start() #启动子线程
25 t.join()#jion()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞
26 endtime=time.time();#记录程序结束时间
27 totaltime=endtime-starttime;#计算程序执行耗时
28 print ("耗时:{0:.5f}秒" .format(totaltime)); #格式输出耗时
29 print(‘---------------------------‘)
30
31 #以下为普通的单线程执行过程,不需解释
32 print("单线程:")
33 starttime=time.time();
34 task1();
35 task2();
36 endtime=time.time();
37 totaltime=endtime-starttime;
38 print ("耗时:{0:.5f}秒" .format(totaltime));

运行结果:

程序2:

 1 import threading
 2 from time import sleep,ctime,time
 3
 4 def music(m):
 5     print("I am listening %s at %s"%(m,ctime()))
 6     sleep(2)
 7
 8 def movie(v):
 9     print("I am seeing %s at %s" %(v,ctime()))
10     sleep(4)
11
12 threads = []
13 t1 = threading.Thread(target=music,args=("心动",))
14 threads.append(t1)
15 t2 = threading.Thread(target=movie,args=("煎饼侠",))
16 threads.append(t2)
17
18 if __name__ == ‘__main__‘:
19     for t in threads:
20         t.setDaemon(True)
21         t.start()
22     t.join()
23     print("all the threads over at %s" %ctime())

运行结果:

程序3:

socket  server和client双向传文件,这里文件路径是写死的,根据自己需求修改:

server:

 1 #coding=utf-8
 2 import socket
 3 import threading
 4 from time import ctime
 5
 6 BUFFERSIZE = 1024
 7 HOST = ‘127.0.0.1‘
 8 PORT = 9999
 9
10 #建立socket连接
11 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
12 s.bind((HOST,PORT))
13 s.listen(1)
14 conn,addr = s.accept()
15 print("Conneted by: %s"%(addr,))
16
17 #收文件
18 def recvfile(filename):
19     f = open(filename,‘wb‘)
20     while True:
21         data = conn.recv(BUFFERSIZE)
22         if str(data)[-4:] ==  ‘EOF\‘‘:
23             f.write(data[:-3])
24             break
25         f.write(data)
26     f.close()
27     print("File received from: %s at %s"%(addr,ctime()))
28
29 def sendfile(filename):
30     f = open(filename,‘rb‘)
31     f_data = f.read()
32     f.close()
33     conn.sendall(f_data)
34     conn.send((‘EOF‘).encode())
35     print("Server send finished at %s" %ctime())
36
37 recvname = "d:\\2.mp4"
38 sendname = "d:\\a.mp4"
39
40 threads = []
41 t1 = threading.Thread(target=recvfile,args=(recvname,))
42 threads.append(t1)
43 t2 = threading.Thread(target=sendfile,args=(sendname,))
44 threads.append(t2)
45
46 if __name__ == "__main__":
47
48     for t in threads:
49         t.setDaemon(True)
50         t.start()
51     t.join()
52     conn.close()

client:

 1 import socket
 2 import threading
 3 from time import ctime
 4
 5 BUFFERSIZE = 1024
 6 HOST = ‘127.0.0.1‘
 7 PORT = 9999
 8
 9 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
10 s.connect((HOST,PORT))
11
12 def sendfile(filename):
13     f = open(filename,‘rb‘)
14     f_data = f.read()
15     f.close()
16     s.sendall(f_data)
17     s.send((‘EOF‘).encode())
18     print("Client send finished at %s" %ctime())
19
20 def recvfile(filename):
21     f = open(filename,‘wb‘)
22     while True:
23         data = s.recv(BUFFERSIZE)
24         if str(data)[-4:] ==  ‘EOF\‘‘:
25             f.write(data[:-3])
26             break
27         f.write(data)
28     f.close()
29     print("File received from: %s at %s"%(HOST,ctime()))
30
31 sendname = "e:\\1.mp4"
32 recvname = "e:\\b.mp4"
33
34 threads = []
35 t1 = threading.Thread(target=sendfile,args=(sendname,))
36 threads.append(t1)
37 t2 = threading.Thread(target=recvfile,args=(recvname,))
38 threads.append(t2)
39
40
41 if __name__ == "__main__":
42     for t in threads:
43         t.setDaemon(True)
44         t.start()
45     t.join()
46     s.close()
时间: 2024-11-09 06:00:08

Python 多线程学习的相关文章

python多线程学习记录

1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start(),启动线程 t.join(),阻塞当前线程,即使得在当前线程结束时,不会退出.会等到子线程结束之后才退出. 如果不加join语句,主线程不会等到子线程结束才结束,但却不会立即杀死该线程. 但是如果添加了SetDaemon(True),如果不加join,则会在主线程结束后马上杀死子线程. 如果join

Python多线程学习资料1

一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: view plaincopy to clipboardprint? import time import thread def timer(no, interval): cnt = 0 while cnt<10: print 'Thread:(%d) Time:%s\n'%(no, time.cti

Python 多线程学习(转)

转自:http://www.cnblogs.com/slider/archive/2012/06/20/2556256.html 引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程.进程和异步 I/O 的支持.在许多情况下,通过创建诸如异步.线程和子进程之类的高层模块,Python 简化了各种并发方法的使用.除了标准库之外,还有一些第三方的解决方案,例如 Twisted.Stackless 和进程模块.本文重点关注于使用 Python 的线程,并使用了一些实际的示例进行说明

Python学习之(二) Python多线程学习

多线程的一个实例 #coding=utf-8 #!/usr/bin/python import time import thread def timer(no, interval): cnt = 0 while cnt<10: time.sleep(interval) print 'Thread:(%d) Time:%s' % (no, time.ctime()) cnt+=1 thread.exit_thread() def test(): #Use thread.start_new_thre

Python多线程学习

一.Python中的线程使用:     Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: import time import thread def timer(no, interval): cnt = 0 while cnt<10: print 'Thread:(%d) Time:%s\n'%(no, time.ctime()) time.sleep(interval) cnt

Python多线程学习(中)

今天接着写多线程,最近几天一直在看多线程,但是书上的例子太难看了(可能我天生愚笨吧-_-),看了好久才搞懂,我看了两本书才搞明白书上的例子,所以大家在看书学习看不懂的时候,推荐多看几本一样知识点的书,在网上多看教程,辅助学习. 下面开始介绍锁和条件变量. 一."锁" 锁是指在运行程序时,对于需要访问共享资源的多线程程序,为防止I/O密集型操作造成结果发生错误. 使用锁的方法:  import threading 引入锁 lock = threading.Lock() 添加锁  lock

Python多线程问题的资料查找与汇总by tsy

声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpeach删除相应部分. 3)本文档内容涉及Python的多线程问题,没有介绍多线程的概念,没有介绍多线程的程序模块,只是讨论多线程产生的交织问题,并查找一些材料进行佐证和学习. 4)仅仅作为参考用途,抛砖引玉,不作为证据证明用途,请自行取舍,核实引用. 5)本文的超链接,请不要直接点击,为方便阅读,请选择“在新标签页打开”. 非常抱歉,我不是

【python,threading】python多线程

使用多线程的方式 1.  函数式:使用threading模块threading.Thread(e.g target name parameters) 1 import time,threading 2 def loop(): 3 print("thread %s is running..." % threading.current_thread().name) 4 n = 0 5 while n < 5: 6 n += 1 7 print("thread %s is r

Python多线程(threading)学习总结

注:此文除了例子和使用心得是自己写的,很多都是Python核心编程中的原文.原文文风应该能看出来,就不每个地方单独表明出处了. 线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境.它们可以想像成是在主进程或"主线程"中并行运行的"迷你进程". 线程有开始,顺序执行和结束三部分.它有一个自己的指令指针,记录自己运行到什么地方.线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步.一个