python之多线程执行和非线程执行的对比

一、非线程执行(普通的执行)

1、非线程运行,简单代码如下

#_*_coding:utf-8_*_
import time
import threading

a = []
b = []

def func1():
    print "func1 start %s" % time.ctime()
    alist = ["192.168.1.100","192.168.1.120","192.168.1.134","192.168.1.213"]
    for i in alist:
        a.append(i)
    time.sleep(3)

def func2():
    print "func2 start %s" % time.ctime()
    blist = ["pc1","pc2","pc45","pc23"]
    for i in blist:
        b.append(i)
    time.sleep(2)
func1()
func2()
print a,b

2、执行结果

/usr/bin/python2.7 /home/toby/PycharmProjects/SOMS/test.py

func1 start Tue Feb 28 03:03:44 2017    
func2 start Tue Feb 28 03:03:47 2017    
[‘192.168.1.100‘, ‘192.168.1.120‘, ‘192.168.1.134‘, ‘192.168.1.213‘] [‘pc1‘, ‘pc2‘, ‘pc45‘, ‘pc23‘]

3、对执行结果简单分析

3分44秒运行函数func1,运行完之后,那么在3分47秒开始运行函数func2。也就是说这是典型的顺序执行。

二、多线程运行

1、多线程的代码如下

#_*_coding:utf-8_*_
import time
import threading

a = []
b = []

def func1():
    print "func1 start %s" % time.ctime()
    alist = ["192.168.1.100","192.168.1.120","192.168.1.134","192.168.1.213"]
    for i in alist:
        a.append(i)
    time.sleep(3)

def func2():
    print "func2 start %s" % time.ctime()
    blist = ["pc1","pc2","pc45","pc23"]
    for i in blist:
        b.append(i)
    time.sleep(2)

thr = []
t1 = threading.Thread(target=func1,)
thr.append(t1)
t2 = threading.Thread(target=func2,)
thr.append(t2)

for i in thr:
    i.setDaemon(True)
    i.start()
t1.join()
t2.join()
print a,b

2、多线程执行结果

/usr/bin/python2.7 /home/toby/PycharmProjects/SOMS/test.py
func1 start Tue Feb 28 03:09:32 2017
func2 start Tue Feb 28 03:09:32 2017
[‘192.168.1.100‘, ‘192.168.1.120‘, ‘192.168.1.134‘, ‘192.168.1.213‘] [‘pc1‘, ‘pc2‘, ‘pc45‘, ‘pc23‘]

3、执行结果简单分析

线程t1调用函数func1,线程t2调用函数func2,根据运行时间来看,这两个线程是在同一时间运行。

注意:

join()方法,用于等待线程终止。join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。 join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。不然,会由于主线程执行完结束,从而导致子线程也终止。

时间: 2024-10-14 19:14:32

python之多线程执行和非线程执行的对比的相关文章

Java多线程——<三>简单的线程执行:Executor

一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个线程然后都调用他的start方法,这么一看,似乎有些问题:第一.线程一旦多了,声明势必是个问题:第二.多线程启动如果通过手动执行的话,那可能一个线程已经跑完了,另外一个还没起来(我推测可能会出现这个问题).所以,我们在想,如果有个管家,能够帮我们管理这么多线程,只需要把我们定义的任务交给管家,管家就能够帮我们

Java多线程系列四——控制线程执行顺序

假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatch类:指定计数器,当计数器清零即取消阻塞 import java.util.concurrent.CountDownLatch; import org.junit.Assert; import org.junit.Test; /** * @Description: 规定线程次序的方法 */ publ

python基础 多线程threading join 守护线程setDeamon 递归锁Rlock

开篇大概介绍多线程与多进程区别,详细的理论区别自己可以在其它博客搜一下,这里不再赘述 同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作:cpu执行的都是线程,默认程序会开一个主线程:进程是程序以及和程序相关资源的集合:某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明 简单的多线程 1 import threading, time 2 3 def test1(x): 4 time.sleep(5) 5 print(x**x)

C#多线程List的非线程安全性

背景:最近在做多线程方面的工作,工作中发现多线程中很多坑,这里就有一个List添加对象的误区,这里做个分享跟大家讲讲这个坑是怎么形成的怎么样避免. 示例: 代码及错误: 如果单单只从程序逻辑上看,应该没有逻辑错误,但是结果却是是有为空值的情况,这时候有些多线程经验的读者可能会想到,构造函数也是一个函数,有可能在往List中添加对象的时候,构造函数还没有将对象返回就执行了添加操作,造成了这个问题的出现,下面我们来验证一下这个观点是否正确. 从图中可以看到,在对象new之后立即执行了取属性操作,如果

Java多线程编程7--SimpleDateFormat非线程安全处理

类SimpleDateFonnat主要负责日期的转换与格式化,但在多线程的环境中,使用此类容易造成数据转换及处理的不准确,因为SimpleDateFormat类并不是线程安全的. 1.出现异常 本示例将实现使用类SimpleDateFormat在多线程环境下处理日期但得出的结果却是错误的情况,这也是在多线程环境开发中容易遇到的间题. public class MyThread extends Thread { private SimpleDateFormat sdf; private Strin

JAVA中的线程安全与非线程安全

原文:http://blog.csdn.net/xiao__gui/article/details/8934832 ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题.面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,St

线程安全和非线程安全

ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题.面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的.因为这是昨晚刚背的<Java面试题大全>上面写的.此时如果继续问:什么是线程安全

[ Python - 11 ] 多线程及GIL全局锁

1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL. 2. 为什么会有GIL? 为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性 (例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2

秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

版权声明:本文为博主原创文章,未经博主允许不得转载. 前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇 <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> 来