python核心编程笔记4--多线程

单线程程序:

import time
def Sorry():
    print "I‘m sorry!"    time.sleep(1)
if __name__==‘__main__‘:
    for i in range(5):
        Sorry()

添加线程


import threading

def thread_job():    print ‘this is an added Thread,number is %s‘ % threading.current_thread()

if __name__ == ‘__main__‘:    added_thread = threading.Thread(target=thread_job)    added_thread.start()

join 等待线程结束之后再往下执行

import time,threading
def thread_job():
    print ‘T1 start\n‘
    for i in range(10):
        time.sleep(0.1)
    print ‘T1 finish\n‘

def mian():
    added_thread = threading.Thread(target=thread_job,name=‘T1‘)
    added_thread.start()
    print ‘all done\n‘
if __name__ == ‘__main__‘:
    mian()
import time,threading
def thread_job():
    print ‘T1 start\n‘
    for i in range(10):
        time.sleep(0.1)
    print ‘T1 finish\n‘

def mian():
    added_thread = threading.Thread(target=thread_job,name=‘T1‘)
    added_thread.start()
    added_thread.join()
    print ‘all done\n‘
if __name__ == ‘__main__‘:
    mian()

Queue功能,因为线程中不能使用return

import time,threading
from queue import Queue
def job(l,q):
    for i in range(len(l)):
        l[i] = l[i]**2
    q.put(l)
def multithreading():
    q = Queue()
    threads = []
    data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
    for i in range(4):
        t = threading.Thread(target=job,args=(data[i],q))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()
    results = []
    for _ in range(4):
        results.append(q.get())
    print results
if __name__ == ‘__main__‘:
    multithreading()

lock锁

import threading
def job1():
    global A
    for i in range(10):
        A += 1
        print ‘job1 %d‘ % A
def job2():
    global A
    for i in range(10):
        A += 10
        print ‘job2 %d‘ % A

if __name__ == ‘__main__‘:
    A = 0
    t1 = threading.Thread(target=job1)
    t2 = threading.Thread(target=job2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
import threading
def job1():
    global A,lock
    lock.acquire()
    for i in range(10):
        A += 1
        print ‘job1 %d‘ % A
    lock.release()
def job2():
    global A,lock
    lock.acquire()
    for i in range(10):
        A += 10
        print ‘job2 %d‘ % A
    lock.release()

if __name__ == ‘__main__‘:
    lock = threading.Lock()
    A = 0
    t1 = threading.Thread(target=job1)
    t2 = threading.Thread(target=job2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

ps:多线程不一定有效率,有GIL锁的存在,python只能同一时间让一个线程运算同一个运算

import threading
from queue import Queue
import copy
import time

def job(l, q):
    res = sum(l)
    q.put(res)

def multithreading(l):
    q = Queue()
    threads = []
    for i in range(4):
        t = threading.Thread(target=job, args=(copy.copy(l), q), name=‘T%i‘ % i)
        t.start()
        threads.append(t)
    [t.join() for t in threads]
    total = 0
    for _ in range(4):
        total += q.get()
    print(total)

def normal(l):
    total = sum(l)
    print(total)

if __name__ == ‘__main__‘:
    l = list(range(1000000))
    s_t = time.time()
    normal(l*4)
    print(‘normal: ‘,time.time()-s_t)
    s_t = time.time()
    multithreading(l)
    print(‘multithreading: ‘, time.time()-s_t)

原文地址:https://www.cnblogs.com/mohu/p/8889665.html

时间: 2024-10-06 08:18:56

python核心编程笔记4--多线程的相关文章

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

python核心编程笔记----threading

一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程之间更方便地共享数据以及相互通讯. 1.全局解释器锁(GIL) Python 解释器中可以"运行"多个线程,但在任意时刻,只有一个线程在解释器中运行.在多线程环境中,Python 虚拟机(解释器)按以下方式执行:1).设置 GIL2).切换到一个线程去运行3).运行: a. 指定数量的字节码指令,或者 b. 线程主动让出控制(可以调用 time.sleep(0))4).把线程设置为睡眠状态5).解锁 GIL6).再次重复

Python核心编程笔记(类)

Python并不强求你以面向对象的方式编程(与Java不同) # coding=utf8 class FooClass(object): version = 0.1 def __init__(self, nm='John Doe'): self.name = nm print('Created a class instance for', nm) def showname(self): print('Your name is ', self.name) print('My name is ',

《Python核心编程》18.多线程编程(三)

18.6使用threading模块 #!/usr/bin/env python # -*- coding:utf-8 -*- """从Thread类中派生出一个子例,创建一个这个子类的实例""" import threading from time import sleep, ctime loops = (4, 2) class MyThread(threading.Thread): """ 1.子类化Thread类

《Python核心编程》 18.多线程编程(一)

一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是CPU.相关寄存器.RAM之间的事情.负责处理任务的顺序有CPU决定. 2.程序的上下文:当CPU处理任务时,所需要的各种资源(显卡.寄存器等)准备完毕,构成了这个程序的执行环境,即上下文. 3.CPU处理任务顺序:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程

Python核心编程笔记----注释

python 中注释有两种 第一种,文档注释 第二种,一般的注释 下面是例子: class MyClass: '这个是文档注释' def __repr__(self): return "repr"; def __str__(self): return "str"; ------------------------------------------ #‘#’是一般的注释# 测试print 时调用的函数! a = MyClass();print "print

Python核心编程笔记---- [email protected]

print 的输出从定向问题 print 可以用’>>‘来重定向输出,下面是例子 f = open('D:/python.txt','w+') print >> f,"这里是我将要写入到文件D:/python.txt的东西"; f.close();

Python核心编程笔记----Python对象

本章内容: Python对象 內建类型 标准类型操作符 值的比较 对象身份比较 布尔类型 标准类型內建函数 标准类型总览 各种类型 不支持的类型 Python对象  所有Python对象都有三个特性:身份,类型和值 身份:唯一的身份标识,对象的内存地址,内建函数id()可以得到.(极少用到)     只读 类型:对象的类型决定该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则.內建函数type()查看对象的类型,因为在python中类型也是对象,所以type()返回的是对象而

《Python核心编程》18.多线程编程(二)

18.1没有线程支持 #!/usr/bin/env python # -*- coding:utf-8 -*- from time import sleep, ctime def loop0(): print 'start loop 0 at:', ctime() sleep(4) print 'loop 0 done at', ctime() def loop1(): print 'start loop 1 at:', ctime() sleep(2) print 'loop 1 done a