python学习(十三)进程和线程
python多进程
from multiprocessing import Process
import os def processFunc(name):
print("child process is %s, pid is %s" %(name, os.getpid() ) )
return
if __name__ == '__main__':
print("Parent process is %s." %(os.getpid() ))
p = Process(target = processFunc, args = ('test', ))
print('Child will start ')
p.start()
p.join()
print("Child stop")
进程池
from multiprocessing import Pool
import os , time, random def long_time_task(name):
print('run task name is %s' %(name))
start = time.time()
time.sleep(random.random()*3)
end = time.time()
print('Task %s runs %0.2f seconds.' %(name, (end - start )) ) if __name__ == '__main__':
print('Parent pid is %s' %(os.getpid() ))
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args = (str(i) ,) )
print("Waiting all processes!!!")
p.close()
p.join()
print("All subprocess done")
启动进程,并调用命令行
import subprocess
print('$ nslookup www.python.org')
r = subprocess.call(['nslookup', 'www.python.org'])
print('Exit code:', r)
队列Queue可实现两个进程间通信
from multiprocessing import Process, Queue
import os, time, random def write(q):
print('Process to Write pid is %s' %(os.getpid() ) )
for i in ['A','B','C']:
q.put(i)
time.sleep(random.random()) def read(q):
print('Process to Read pid is %s' %(os.getpid() ) )
while(True):
value = q.get(True)
print('Get %s from queue ' %(value)) if __name__ == '__main__':
q = Queue()
pw = Process(target=write, args = (q,))
pr = Process(target = read , args = (q,) )
pw.start()
pr.start()
pw.join()
pr.terminate()
python多线程
import threading , time
def loop():
print('thread %s is running ...' % threading.current_thread().name)
n = 0
while n < 5:
n = n+ 1
print('thread %s >>> %s' %(threading.current_thread().name, n))
time.sleep(1)
print('thread %s ended. ' %(threading.current_thread().name ) ) if __name__ == '__main__':
print('Thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target = loop, name = 'LoopThread')
t.start()
t.join()
print('Thread %s ended.' % threading.current_thread().name)
多线程访问全局变量,记得加锁
import time, threading # 假定这是你的银行存款:
balance = 0
lock = threading.Lock() def change_it(n):
# 先存后取,结果应该为0:
global balance
balance = balance + n
balance = balance - n def run_thread(n):
for i in range(100000):
lock.acquire()
try:
change_it(n)
finally:
lock.release() t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
避免枷锁带来的效率衰退,可使用线程本地变量
import threading
# 创建全局ThreadLocal对象:
local_school = threading.local() def process_student():
# 获取当前线程关联的student:
std = local_school.student
print('Hello, %s in thread %s' %(std, threading.current_thread().name )) def process_thread(name):
# 绑定ThreadLocal的student:
local_school.student = name
process_student() if __name__ == '__main__':
t1 = threading.Thread(target = process_thread, args=('Alice',), name = 'Thread-A')
t2 = threading.Thread(target= process_thread, args=('Bob',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()
分布式进程,用于不同机器通信,采用BaseManager,在masterprocess.py中实现如下
import random, time, queue
from multiprocessing.managers import BaseManager task_queue = queue.Queue()
result_queue = queue.Queue() def taskqueuefunc():
global task_queue
return task_queue def resultqueuefunc():
global result_queue
return result_queue class QueueManager(BaseManager):
pass def ServerStart():
QueueManager.register('get_task_queue', callable = taskqueuefunc)
QueueManager.register('get_result_queue', callable = resultqueuefunc)
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
manager.start() task = manager.get_task_queue() result = manager.get_result_queue() for i in range(10):
n = random.randint(0,10000)
print('Put task %d...' %n)
task.put(n) # 从result队列读取结果:
print('Try get results...')
for i in range(10):
r = result.get(timeout=10)
print('Result: %s' % r)
# 关闭:
manager.shutdown()
print('master exit.') if __name__ == '__main__':
ServerStart()
在另一个文件workprocess.py中实现另一个进程处理数据
import time,sys,queue
from multiprocessing.managers import BaseManager class QueueManager(BaseManager):
pass QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue') server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)
m = QueueManager(address=(server_addr,5000),authkey=b'abc')
m.connect()
task = m.get_task_queue()
result = m.get_result_queue()
for i in range(10):
try:
n = task.get(timeout=1)
print('run task %d %d...' % (n,n))
r = '%d %d = %d' % (n,n,n*n)
time.sleep(1)
result.put(r)
except queue.Empty:
print('task queue is empty.')
print('worker exit.')
先启动masterprocess.py,然后启动workprocess.py,可以看到效果
谢谢关注我的公众号
python学习(十三)进程和线程的更多相关文章
- Python学习--17 进程和线程
线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 进程 fork调用 通过fork()系统调用,就可以生成一个子进程 ...
- Python学习--18 进程和线程
线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 进程 fork调用 通过fork()系统调用,就可以生成一个子进程 ...
- python学习之-- 进程 和 线程
python 进程/线程详解 进程定义:以一个整体的形式暴露给操作系统管理,它里面包含对各种资源的调用,内存的管理,网络接口的调用等等,对各种资源管理的集合,就可以叫做一个进程. 线程定义:线程是操作 ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
- python中的进程、线程(threading、multiprocessing、Queue、subprocess)
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- Python学习day38-并发编程(线程)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- VC++学习之进程和线程的区别
VC++学习之进程和线程的区别 一.进程 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘 ...
- JUC学习笔记——进程与线程
JUC学习笔记--进程与线程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的进程与线程部分 我们会分为以下几部分进行介绍: 进程与线程 并发与并行 同步与异步 线程详解 进程与线程 ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
随机推荐
- 基于C#的机器学习--面部和动态检测-图像过滤器
在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中. 在这一章中,我们将讨论: 面部检测 动态检测 将检测添加到应用程序中 面部检测 人 ...
- [T-ARA][HUE]
歌词来源:http://music.163.com/#/song?id=22704406 wa du seu mo geum to yo do ga tae 어딜가도 스페셜한게 없어 [eo-dil ...
- HttpServlet 详解(基础)
HttpServlet详解 大家都知道Servlet,但是不一定很清楚servlet框架,这个框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在java ...
- 基于 Agent 的模型入门:Python 实现隔离仿真
2005 年诺贝尔经济学奖得主托马斯·谢林(Thomas Schelling)在上世纪 70 年代就纽约的人种居住分布得出了著名的 Schelling segregation model,这是一个 A ...
- loadrunner之analysis详解
本文原出处:http://blog.csdn.net/lykangjia/article/details/56009750 一.常用到的性能测试术语 1.事务(Transaction) 在web性能测 ...
- loadrunner socket协议问题归纳(3)
摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...
- PSP Daily——团队项目Alpha发布
视频展示:优酷视频链接.文案如下 PSP Daily软件NABCD分析: 1) N (Need 需求) PSP Daily 解决了用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜 ...
- HDU 5200 Trees 二分
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5200 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- JS高级 2
递归:函数自己调用自己 在JavaScript中唯一能产生作用域的东西是 函数!js中只有函数可以创建作用域 词法作用域,也叫做静态作用域 //就是在代码写好的那一刻,变量和函数的作用域就已经确定了, ...
- 框架整合小小总结【SSH】注解式
Spring 注解式注册 bean: 大致分为以下几步: 开启 context 空间支持 开启自动扫描功能,指定扫描包路径 使用注解配置 bean (使用@Component 注解) 给 bean 注 ...