python线程任务run_python线程、进程知识梳理

一.python线程

线程用于提供线程相关的操作,线程是应用程序中工作的最小单元。

#!/ usr / bin / env python

# - * - coding:utf-8 - * -

import threading

import time

def show(arg):

time.sleep(1)print'thread

'+ str(arg)

for我在范围(10)中:

t = threading.Thread(target = show,args =(i,))

t.start()print'main

thread stop

上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。

更多方法:

start线程准备就绪,等待CPU调度

setName为线程设置名称

getName获取线程名称

setDaemon设置为后台线程或前台线程(默认)

如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止

如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止加入逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义,run线程被执行cpu调度后自动执行线程对象的运行方法

import threading

import time

class MyThread(threading.Thread):

def __init__(self,num):

threading.Thread.__init__(self)

self.num = num

def run(self):#定义每个线程要运行的函数

print("running on number:%s" %self.num)

time.sleep(3)

if __name__ == '__main__':

t1 = MyThread(1)

t2 = MyThread(2)

t1.start()

t2.start()

自定义线程类

二.线程锁(锁,RLOCK)

由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,当多个线程同时修改同一条数据时可能会出现脏数据,所以,出现了线程锁 - 同一时刻允许一个线程执行操作。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import threading

import time

gl_num = 0

def show(arg):

global gl_num

time.sleep(1)

gl_num +=1

print gl_num

for i in range(10):

t = threading.Thread(target=show, args=(i,))

t.start()

print 'main thread stop'

未使用锁

互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。

三.信号量(信号量)

import threading,time

def run(n):

semaphore.acquire()

time.sleep(1)

print("run the thread:%s" %n)

semaphore.release()

if __name__ == '__main__':

num= 0

semaphore = threading.BoundedSemaphore(5) #最多允许5个线程同时运行

for i in range(20):

t = threading.Thread(target=run,args=(i,))

t.start()

四.事件(事件)

python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法set,wait,clear。

事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为False,那么当程序执行event.wait方法时就会阻塞,如果“Flag”值为True,那么event.wait方法时便不再阻塞。

clear:将“Flag”设置为False

set:将“Flag”设置为True

def condition_func():

ret = False

inp = input('>>>')

if inp == '1':

ret = True

return ret

def run(n):

con.acquire()

con.wait_for(condition_func)

print("run the thread:%s" %n)

con.release()

if __name__ == '__main__':

con = threading.Condition()

for i in range(10):

t = threading.Thread(target=run, args=(i,))

t.start()

六.Timer

七.python进程

八.进程数据共享

进程各自持有一份数据,默认无法共享数据

#!/usr/bin/env python

#coding:utf-8

from multiprocessing import Process

from multiprocessing import Manager

import time

li = []

def foo(i):

li.append(i)

print 'say hi',li

for i in range(10):

p = Process(target=foo,args=(i,))

p.start()

print 'ending',li

进程间默认无法数据共享

'c': ctypes.c_char, 'u': ctypes.c_wchar,

'b': ctypes.c_byte, 'B': ctypes.c_ubyte,

'h': ctypes.c_short, 'H': ctypes.c_ushort,

'i': ctypes.c_int, 'I': ctypes.c_uint,

'l': ctypes.c_long, 'L': ctypes.c_ulong,

'f': ctypes.c_float, 'd': ctypes.c_double

类型对应表

from multiprocessing import Process, Queue

def f(i,q):

print(i,q.get())

if __name__ == '__main__':

q = Queue()

q.put("h1")

q.put("h2")

q.put("h3")

for i in range(10):

p = Process(target=f, args=(i,q,))

p.start()

Code

当创建进程时(非使用时),共享数据会被拿到子进程中,当进程中执行完毕后,再赋值给原值。

九.进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

申请

apply_async

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from multiprocessing import Process,Pool

import time

def Foo(i):

time.sleep(2)

return i+100

def Bar(arg):

print arg

pool = Pool(5)

#print pool.apply(Foo,(1,))

#print pool.apply_async(func =Foo, args=(1,)).get()

for i in range(10):

pool.apply_async(func=Foo, args=(i,),callback=Bar)

print 'end'

pool.close()

pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jrtplib使用注意事项

一、说明 RTP 现在的问题是要解决的流媒体的实时传输的问题的最佳方法。和JRTPLIB 是一个用C语言实现的RTP库。包含UDP通讯。刚使用JRTPLIB,对JRTPLIB的理解还不够深,当做使用时,积累的一些经验写个笔记吧。 二、RTP协议 实时传送协议&#x…

oracle字符串使用函数,Oracle常用函数介绍之一(字符串)

最近工作需要从Excel 导入一些数据,由于源数据的不规范,需要进行数据的清洗工作,需要自己把耽误多日的Oracle 函数重新巩固一下。搜集了一些网络资料,整理下来,以供自己以后查对。1. ASCII返回与指定的字符对应的十进制…

JAVA中获得一个月最大天数的方法(备忘)

Calendar 类是一个抽象类,为日历字段之间的转换提供了一些方法。其中有一个重要方法 getActualMaximum ,该方法用于返回指定日历字段实际的最大值。 利用这个方法(Calendar.getActualMaximum),我们可以获得某年某月的天数。 代码如下&#xf…

LeetCode 1874. 两个数组的最小乘积和

文章目录1. 题目2. 解题1. 题目 给定两个长度相等的数组a和b&#xff0c;它们的乘积和为数组中所有的a[i] * b[i]之和&#xff0c;其中 0 < i < a.length。 比如a [1,2,3,4]&#xff0c;b [5,2,3,1]时&#xff0c;它们的乘积和为 1*5 2*2 3*3 4*1 22 现有两个长…

eplise怎么连接数据库_eclipse连接mysql

JDBC代表Java数据库连接(Java Database Connectivity)&#xff0c;它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API&#xff0c;换句话说&#xff1a;JDBC是用于在Java语言编程中与数据库连接的API。到www.mvnrepository.com网站中&#xff0c;搜索mysql&…

【NS2】在linux下安装低版本GGC

1、下载安装包&#xff0c;cd到文件所在目录 sudo dpkg -i gcc41-compat-4.1.2-ubuntu1210_i386.deb g41-compat-4.1.2_i386.deb 2、查看安装到系统的gcc ls /usr/bin/gcc* 3、 下载完包之后&#xff0c;建议是直接sudo dkpg -i *.deb这样安装 由于gcc安装互相有版本的支持&…

oracle+资料类型不一致吗,oracle数据库中,字段类型不一致,导致查询慢

最近一个WEBSERVICE突然变慢了&#xff0c;后查询发现&#xff0c;后台查询也非常慢(记录条数800多万)&#xff0c;索引也有&#xff0c;如下语句SELECT P.ID,P.RECORD_ID,P.KEY_NAME,P.KEY_CONTENTFROM MED_EMR_PATIENT_RECORD R,MED_EMR_RECORD_EXTRACTINFO PWHERE R.ID P.R…

LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个由整数数组组成的数组arrays&#xff0c;其中arrays[i]是严格递增排序的&#xff0c;返回一个表示所有数组之间的最长公共子序列的整数数组。 子序列是从另一个序列派生出来的序列&#xff0c;删除一些元素或不删除任何元素&#xff0…

最小二乘估计_相关性及最小二乘估计【20201026】

考前高考要求1.知识要求对知识的要求依次是了解、理解、掌握三个层次.2.能力要求(1)空间想象能力(2)抽象概括能力(3)推理论证能力(4)运算求解能力(5)数据处理能力(6)应用意识(7)创新意识3.个性品质要求个性品质是指考生个体的情感、态度和价值观.要求考生具有一定的数学视野&am…

mac node oracle,将Python3.5(Mac OS X El Capitan)连接到Oracle集群(远程)

我正在尝试将Python3.5(Mac OS X El Capitan)连接到Oracle集群(远程)。对于安装cx_Oracle&#xff0c;我设置了&#xff1a;export ORACLE_HOME/Applications/oracle/instantclient_11_2export LD_LIBRARY_PATH$ORACLE_HOMEexport DYLD_LIBRARY_PATH$ORACLE_HOMEexport PATH$OR…

oracle 只对成绩前三名进行排序其余不变_2021年采用美术统考成绩的重点院校名单汇总...

点击蓝字关注我们吧&#xff01;2019年底&#xff0c;教育部发文&#xff0c;除独立设置的本科艺术院校和参照院校(共48所)外&#xff0c;其余高校的美术学类和设计学类专业不允许组织校考。不管是211工程大学还是985工程大学&#xff0c;均被严格进行组织美术类校考。但是&…

LeetCode 1564. 把箱子放进仓库里 I(排序)

文章目录1. 题目2. 解题1. 题目 给定两个正整数数组 boxes 和 warehouse &#xff0c;分别包含单位宽度的箱子的高度&#xff0c;以及仓库中 n 个房间各自的高度。 仓库的房间分别从 0 到 n - 1 自左向右编号&#xff0c; warehouse[i] &#xff08;索引从 0 开始&#xff09;…

【原】push过快的错误 (Pushing the same view controller instance more than once is not supported)...

今天在点击按钮push viewController 时&#xff0c;控制台报错&#xff1a; Terminating app due to uncaught exception NSInvalidArgumentException, reason: Pushing the same view controller instance more than once is not supported 网上查了以下原因, 是说过快点击可能…

oracle 01589,ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> startup mountORA-32004: 指定了废弃/过时的参数ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它SQL> alter database open;alter database open*第 1 行出现错误:ORA-01122: 数据库文件 1 验证失败ORA-01110: 数据文件 1: D:\APP\ADMINISTRATOR\ORADATA\ORCL…

LeetCode 1580. 把箱子放进仓库里 II(排序)

文章目录1. 题目2. 解题1. 题目 给定两个正整数数组 boxes 和 warehouse &#xff0c;分别包含单位宽度的箱子的高度&#xff0c;以及仓库中n个房间各自的高度。 仓库的房间分别从0 到 n - 1 自左向右编号&#xff0c;warehouse[i]&#xff08;索引从 0 开始&#xff09;是第 …

oracle如何检查是否rac,Oracle RAC 状态检查

(1)srvctl status database -d dbservernameOraclezjgldb2$srvctl status database -d kms实例 kms1 正在节点 zjgldb1 上运行实例 kms2 正在节点 zjgldb2 上运行(2)crs_stat -toraclezjgldb2$crs_stat -t名称 类型 目标 状态 主机-------------…

LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)

文章目录1. 题目2. 解题1. 题目 给定一棵二叉树的根节点 root 和树中的一个节点 u &#xff0c;返回与 u 所在层中距离最近的右侧节点&#xff0c;当 u 是所在层中最右侧的节点&#xff0c;返回 null 。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,4,5,6], u …

vue获取table一列数据_vue表格含有一列多选框,如何获取被选中的行的数据?

1.仿照element-ui官网贴出的demo&#xff0c;table表格多选&#xff0c;选择多行数据时使用 Checkbox。但是无法获取this.multipleSelection的值。相关代码如下&#xff1a;男女个人团队电话: {{ scope.row.stel }}邮箱: {{ scope.row.smail }}地址: {{ scope.row.sadd }}{{ sc…

《你的灯亮着吗》阅读笔记(三)

还有一点感触很深的就是当我们遇到问题时&#xff0c;总是想如何找到一个好的办法来解决问题&#xff0c;然而这往往是治标不治本&#xff0c;不能从根本上解决问题。 再联系我们的小项目&#xff0c;比如在我们编写代码时&#xff0c;出现了一个小BUG&#xff0c;如果我们不去…

oracle 集群 配置,Oracle集群配置

进入em 管理界面看看&#xff0c;现在可以看到已经可以在一个farm里面管理所有的instance了。接下来设置一些 session复制的信息&#xff0c;点击进入 iastest.finproduction.tplife.com 管理界面&#xff0c;然后选择 home&#xff0c;进入 oc4j的管理界面&#xff0c;接着选择…