当前位置: 首页 > 编程日记 > 正文

多线程和mysql

多线程

1、多线程的定义:

什么是线程:
线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,
是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。
(线程是进程中的一个实体,是被系统独立调度和分派的基本单元)

线程和进程的区别

(1)线程共享内存空间;进程的内存是独立的

(2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现

(3)创建新线程很简单; 创建新进程需要对其父进程进行一次克隆

(4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程

(5)改变主线程(如优先权),可能会影响其它线程;改变父进程,不影响子进程

现在pc都是多核的,使用多线程能充分利用 CPU 来提供程序的执行效率
线程:
    线程是一个基本的 CPU 执行单元,它必须依托于进程存活
进程:
    进程是指一个程序在给定数据集合上的一次执行过程,是系统进行资源分配和运行调用的独立单位。
    可以简单地理解为操作系统中正在执行的程序。也就说,每个应用程序都有一个自己的进程

每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程

两者的区别
线程必须在某个进程中执行。
一个进程可包含多个线程,其中有且只有一个主线程。
多线程共享同个地址空间、打开的文件以及其他资源。
多进程共享物理内存、磁盘、打印机以及其他资源。

单线程:

例1:

from time import ctime, sleepdef music(a):for i in range(2):print 'I was listening to %s. %s' % (a, ctime())sleep(1)def movie(b):for i in range(2):print 'I was watching to %s. %s' % (b, ctime())sleep(5)music('告白气球')
movie('战狼')
print 'all over %s' % ctime()

总结:单线程, 之前的操作系统处理问题都是单任务的,如果我想做听音乐和看电影两件事,那么一定要先排一下顺序,然后按顺序执行。即一个任务只能在上一个任务完成后执行。

多线程:

情况1:

python有两个模块实现多线程thread 和threading ,因为threading 弥补了thread 的一些缺点。

import threading
from time import sleep, ctimedef music(a):for i in range(2):print 'I was listening to %s. %s' % (a, ctime())sleep(1)def movie(b):for i in range(2):print 'I was watching to %s. %s' % (b, ctime())sleep(5)# 创建threads列表
threads = []t1 = threading.Thread(target=music, args=('告白气球',))
threads.append(t1)
t2 = threading.Thread(target=movie, args=('战狼',))
threads.append(t2)
for t in threads:# 当父线程执行完最后一条语句后:print 'all over %s' %ctime()# 没有等待子线程,直接就退出了,同时我们的子线程也一同结束t.setDaemon(True)t.start()
print 'all over %s' % ctime()

总结:

从结果中可以看出,主线程没有等待子线程,执行后就直接就退出了程序执行,同时我们的子线程也一同结束。

多线程

情况2:

例1:

import threading
from time import sleep, ctimedef music(a):for i in range(2):print 'I was listening to %s. %s' %(a,ctime())sleep(1)
def movie(b):for i in range(2):print 'I was watching to %s. %s' %(b,ctime())sleep(5)# 创建threads列表
threads=[]t1 = threading.Thread(target=music,args=('告白气球',))
threads.append(t1)
t2 = threading.Thread(target=movie,args=('泰坦尼克号',))
threads.append(t2)
for t in threads:t.setDaemon(True)t.start()
# join()的作用是,在子线程完成之前,这个子线程的父线程将一直被阻塞
t.join()
print 'all over %s' %ctime()

总结:

在子线程完成之前,这个子线程的父线程将一直被阻塞。也就是说music 和move 是同时执行。且主线程在等待子线程,没有直接结束。其中的关键是join()

join()的作用是,在子线程完成之前,这个子线程的父线程将一直被阻塞.

故主线程是在子线程执行完之后才执行。

例2:
import time
from threading import Threaddef Foo(arg):for item in range(10):print itemtime.sleep(1)print 'before'
t1 = Thread(target=Foo, args=(1,))
t1.setDaemon(True)
t1.start()
print 'after'
"""
主线程没有结束,子线程还会执行
什么时候主线程执行完了,子线程跟着主线程一起销毁了
"""
time.sleep(5)

总结:

从结果中可看到,主线程和子线程一起执行,但是主线程执行完成后并没有停止执行,而是子线程继续执行。

例3:

import time
from threading import Threaddef Foo(arg):for item in range(10):print itemtime.sleep(1)print 'before'
t1 = Thread(target=Foo, args=(1,))
# t1.setDaemon(True)
t1.start()
# 主线程到join()不往下走了,直到到子线程执行完了
t1.join(5)
print 'after'
"""
主线程没有结束,子线程还会执行
什么时候主线程执行完了,子线程跟着主线程一起销毁了
"""
# time.sleep(5)

线程和函数建立关系

from threading import Threaddef Foo(arg):print argprint 'before'# 让线程和函数建立关系
t1 = Thread(target=Foo, args=(1,))
t1.start()
print t1.getName()
t2 = Thread(target=Foo, args=(2,))
t2.start()
print t2.getName()
print 'after'

mysql

import MySQLdb# 打开门
conn = MySQLdb.Connect(host ='127.0.0.1',user='root',passwd='dd',db='python3')# 伸出手
cur = conn.cursor() # 创建一个手# 拿东西
# 这个操作影响了多少行(有多少行被操作了)
reCount = cur.execute('select * from userInfo')# 把手伸回来
cur.close()
# 把门观赏
conn.close()print reCount

相关文章:

poj2154-color-polyan次二面体+欧拉函数优化

N<1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度&#xff0c;然后可以利用欧拉函数&#xff0c;把复杂度变为O(√n * logn) 1 /*--------------------------------------------------------------------------------------*/2 3 #include <algorithm>4 #in…

【iOS】通讯录分组方式展示数据

本例子是将后台返回的医生列表&#xff08;包含姓名和电话&#xff0c;demo从plist文件读取&#xff09;&#xff0c;按拼音进行分组显示(A-Z)&#xff0c;最终效果如下图&#xff1a; 一、创建Doctor医生类: Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母&#xff…

LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)

client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解&#xff1a; 优点&#xff1a;负载均衡器只负责将请求包分发给物理服务器&#xff0c;而物理服务器将应答包直接发给用户。所以&#xff0c;负载均衡器能处理 很巨大的请求量&#xff0c;这种方式…

【LeetCode】136. Single Number 解题小结

题目&#xff1a; Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 这题目的要求不仅是要求是线性时间…

iOS小技巧积累

平时项目中用到的&#xff0c;记录下来&#xff08;持续更新&#xff09;。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦

1&#xff1a;如果无法保证子类行为的一致性&#xff0c;那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的&#xff0c;都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高&#xff0c;慎…

varnish 实现 CDN 缓存系统构建

cdn 搭建 (server1:172.25.1.1 ) : [roottest1 ~]# ls varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [roottest1 ~]# yum install * -y [roottest1 ~]# cd /etc/varnish/ [roottest1 varnish]# vim /etc/sysconfig/varnish [roottest1 varnish]# sysct…

创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)

在 ML2 配置文件中 enable local network 后&#xff0c;本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。 首先确保各个节点上的 neutorn agent 状态正常。GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents…

【Android】AsyncTask异步类

一、关于AysncTask AsyncTask使得多线程编程更加简单&#xff0c;AsyncTask能在后台线程执行异步任务&#xff0c;并且在UI线程更新界面&#xff0c;而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类&#xff0c;类关系如下&#xff1a; public abstract class As…

高手速成android开源项目【blog篇】

主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神&#xff0c;深挖大神的项目和following&#xff0c;你会发现很多。 一、个人 JakeWharton 就职于SquareGithub地址&#xff1a;https://github.com/JakeWharton代表作&#xff1a;ActionBarSherlock&a…

3、LVS_TUN实现负载均衡

LVS_TUN实现负载均衡 LVS 介绍: LVS 是 Linux Virtual Server 的简称,在实际环境中经常作为 B/S 结构的网络应用中的负载均衡器来使用,工作在 7 层网络模型中的,网络层,也就是通常说的 IP 层,由于数据的处理是在 Linux 内核态完成的,所以相对反向代理服务器来说,性能一般会高一…

【Android】Fragment官方中文文档

以下内容来自Android官方文档。 Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI&#xff0c;以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分&#xff0c;它具有自己的生命周期…

关于MSSQL导入导出时主键与约束丢失的问题解决

导入数据时&#xff0c;使用默认选项&#xff0c;会丢失主键、约束、默认值等属性&#xff0c;按如下步骤操作&#xff1a;-->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询&#xff1a;不要使用默认选项&#xff0c;选择“在SQL Server数据库之间复制对…

Java5中的线程池实例讲解

Java5增加了新的类库并发集java.util.concurrent&#xff0c;该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易&#xff0c;灵活。本文通过一个网络服务器模型&#xff0c;来实践Java5的多线程编程&#xff0c;该模型中使用了Java5中的线程池&#xff0c;阻塞队列…

LNMP架构的搭建

LNMP 架构的搭建 基础架构图 环境&#xff1a; server5: nginx mysql php //需要的安装包 (蓝色为解压后的文件) [roottest5 ~]# /etc/init.d/iptables stop //关掉防火墙 MYSQL 源码安装 [roottest6 ~]#yum install -y gcc gcc-c make ncurses-devel bison opens…

NSString属性什么时候用copy,什么时候用strong?

我们在声明一个NSString属性时&#xff0c;对于其内存相关特性&#xff0c;通常有两种选择(基于ARC环境)&#xff1a;strong与copy。那这两者有什么区别呢&#xff1f;什么时候该用strong&#xff0c;什么时候该用copy呢&#xff1f;让我们先来看个例子。 示例 我们定义一个类…

hihocoder 1152 Lucky Substrings

#1152 : Lucky Substrings 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters, output all its lucky non-empt…

随笔,记2014忆往昔岁月

博客园开通了一年多&#xff0c;这是第一篇博客。在此记下我的第一篇博客&#xff0c;同时&#xff0c;回忆过去几年自己的工作所得所想所感。 大学毕业&#xff0c;工作两年半了&#xff0c;做过很多事&#xff0c;比较杂&#xff0c;做过需求&#xff0c;做过设计&#xff0c…

PHP相关关系及定义

CGI(是一种协议): 是为了保证web server传递过来的数据是标准格式的&#xff0c;方便CGI程序的编写者。 web server&#xff08;如nginx&#xff09;是内容的分发者。 处理静态页面&#xff1a; 如果请求/index.html&#xff0c;web server就可以解…

Apache优化:修改最大并发连接数

http://www.365mini.com/page/apache-concurrency-configuration.htm Apache是一个跨平台的web服务器&#xff0c;由于其简单高效、稳定安全的特性&#xff0c;被广泛应用于计算机技术的各个领域。现在&#xff0c;Apache凭借其庞大的用户数&#xff0c;已成为用户数排名第一的…

黑马程序员___Java基础[02-Java基础语法](一)

Java语言基础组成 一、关键字 1)定义&#xff1a;被Java语言赋予了特殊含义的单词 2)特点&#xff1a;关键字中所有字母均为小写 3)作用及分类&#xff1a; 下面是Java语言保留专用的50个关键字&#xff1a; 用于定义数据类型的关键字&#xff08;12个&#xff09;&#xff1a;…

NSLog打印自定义对象

我们在开发中&#xff0c;如果直接使用NSLog打印对象&#xff0c;则会打印对象的指针&#xff08;如下图&#xff09; 但我们常常希望打印的是对象的属性的值&#xff0c;因此我们需要重写自定义类的description方法&#xff08;打印日志时&#xff0c;对象会收到description消…

数据库的安装与管理

数据库的安装与管理 1.mysql数据库的安装 yum install mariadb-server -y systemctl start mariadb ##开启数据库 netstat -antlupe | grep mysql ##查看端口 vim /etc/my.cnf ##修改配置文件。添加skip-networking1 systemctl restart mariadb ##重起服务 netstat -antlupe |…

SQL性能优化没有那么神秘

经常听说SQL Server最难的部分是性能优化&#xff0c;不禁让人感到优化这个工作很神秘&#xff0c;这种事情只有高手才能做。很早的时候我在网上看到一位高手写的博客&#xff0c;介绍了SQL优化的问题&#xff0c;从这些内容来看&#xff0c;优化并不都是一些很复杂的问题&…

腾讯云无法绑定公网IP问题解释与解决方案。

腾讯云无法绑定公网IP问题解释与解决方案。 http://blog.csdn.net/chenggong2dm/article/details/51475222 解释&#xff1a;公网IP并不直接配置在服务器上&#xff0c;而是在服务器外部的路由上&#xff0c;通过某种映射连接。 解决方案&#xff1a;绑定0.0.0.0 posted on 201…

iOS Category小举例

&#xff08;一&#xff09;Category作用&#xff1a;Category可以向已存在的类添加新的方法&#xff0c;或者覆盖原来类中已经存在的方法&#xff0c;从而扩展已有类&#xff08;在Java中为了实现类似功能&#xff0c;一般是创建子类&#xff09; &#xff08;二&#xff09;C…

memcache

nginxphpmemcache缓存 图解&#xff1a; [roottest5 ~]# /etc/init.d/iptables stop [roottest5 ~]# nginx [roottest5 ~]# /etc/init.d/php-fpm start Starting php-fpm done [roottest5 ~]# tar zxf memcache-2.2.5.tgz [roottest5 ~]# cd memcache-2.2.5 [roottest5…

iOS中KVO模式的解析与应用

最近老翁在项目中多处用到了KVO&#xff0c;深感这种模式的好处。现总结如下&#xff1a; 一、概述 KVO,即&#xff1a;Key-Value Observing&#xff0c;它提供一种机制&#xff0c;当指定的对象的属性被修改后&#xff0c;则对象就会接受到通知。简单的说就是每次指定的被观察…

C 到C++的升级

C所有的变量都可以在需要使用时再定义。 C语言中的变量都必须在作用域开始的位置定义。 register 关键字请求编译器将局部变量存储于寄存器中 在C语言无法获取register 变量的地址 在C中可以取得 register 变量的地址 C编译器有自己的优化方式&#xff0c;所以几乎不用registe…

SET QUOTED_IDENTIFIER OFF语句的作用

先看下面几个sql语句 1SETQUOTED_IDENTIFIER ON2SELECT*FROM"USER" WHEREanetasp34SETQUOTED_IDENTIFIER ON5SELECT*FROM[USER]WHEREanetasp67SETQUOTED_IDENTIFIER OFF8SELECT*FROM[USER]WHEREa"netasp" 910SETQUOTED_IDENTIFIER OFF11SELECT*FROM[USE…