对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效。我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据,同时它还要保证在管理用户线程时保证总是有最大化的计算资源。而python是通过使用全局解释器锁来保护数据的安全性:

python 代码的执行由python虚拟机来控制,即Python先把代码(.py文件)编译成字节码(字节码在Python虚拟机程序里对应的是 PyCodeObject对象,.pyc文件是字节码在磁盘上的表现形式),交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。 python在设计的时候在虚拟机中,同时只能有一个线程执行。同样地,虽然python解释器中可以运行多个线程,但在任意时刻,只有一个线程在解释器 中运行。而对python虚拟机的访问由全局解释器锁来控制,正是这个锁能保证同一时刻只有一个线程在运行。在多线程的环境中,python虚拟机按一下 方式执行:

1,设置GIL(global interpreter lock).

2,切换到一个线程执行。

3,运行:

a,指定数量的字节码指令。

b,线程主动让出控制(可以调用time.sleep(0))。

4,把线程设置为睡眠状态。

5,解锁GIL.

6,再次重复以上步骤。

GIL的特性,也就导致了python不能充分利用多核cpu。而 对面向I/O的(会调用内建操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。如果线程 并为使用很多I/O操作,它会在自己的时间片一直占用处理器和GIL。这也就是所说的:I/O密集型python程序比计算密集型的程序更能充分利用多线 程的好处。

总之,不要使用python多线程,使用python多进程进行并发编程,就不会有GIL这种问题存在,并且也能充分利用多核cpu。

一,提供的功能

提供了多线程和多进程的并发功能

二,基本方法

class concurrent.futures.Executor (注:Executor为ThreadPoolExecutor或者ProcessPoolExecutor)

提供的方法如下:

submit(fn, *args, **kwargs)

fn:为需要异步执行的函数

args,kwargs:为给函数传递的参数

例:

#!/bin/env python

#coding:utf-8

import time,re

import os,datetime

from concurrent import futures

def wait_on_b():

print 5

time.sleep(2)

def wait_on_a():

print 6

time.sleep(2)

ex = futures.ThreadPoolExecutor(max_workers=2)

ex.submit(wait_on_b)

ex.submit(wait_on_a)

wait_on_a和wait_on_b函数会同时执行,因为使用了2个worker

#####################################

map(func, *iterables, timeout=None)

此map函数和python自带的map函数功能类似,只不过concurrent模块的map函数从迭代器获得参数后异步执行。并且,每一个异步操作, 能用timeout参数来设置超时时间,timeout的值可以是int或float型,如果操作timeout的话,会raisesTimeoutError。如果timeout参数不指定的话,则不设置超时间。

func:为需要异步执行的函数

iterables:可以是一个能迭代的对象,例如列表等。每一次func执行,会从iterables中取参数。

timeout:设置每次异步操作的超时时间

例:

#!/bin/env python

#coding:utf-8

import time,re

import os,datetime

from concurrent import futures

data = [‘1‘,‘2‘]

def wait_on(argument):

print argument

time.sleep(2)

return ‘ok‘

ex = futures.ThreadPoolExecutor(max_workers=2)

for i in ex.map(wait_on,data):

print i

map函数异步执行完成之后,结果也是list,数据需要从list中取出

######################################

submit函数和map函数,根据需要,选一个使用即可。

shutdown(wait=True)

此函数用于释放异步执行操作后的系统资源。

If wait is True then this method will not return until all the pending futures are done executing and the resources associated with the executor have been freed. If wait is False then this method will return immediately and the resources associated with the executor will be freed when all pending futures are done executing. Regardless of the value of wait, the entire Python program will not exit until all pending futures are done executing.

You can avoid having to call this method explicitly if you use the with statement, which will shutdown the Executor (waiting as if Executor.shutdown() were called with wait set to True):

with ThreadPoolExecutor(max_workers=4) as e:

e.submit(shutil.copy, ‘src1.txt‘, ‘dest1.txt‘)

三,完整的concurrent例子:

#!/bin/env python

#coding:utf-8

import time,re,fcntl

import os,datetime

from concurrent import futures

count_list = list()

MinuteNum = 1

StartTime = datetime.datetime(2014, 4, 16, 19, 31, 0, 484870)

NowTime = datetime.datetime.now()

os.system(‘:>new.txt‘)

f_new = open(‘new.txt‘,‘a‘)

def test(CountTimeFormat):

f = open(‘push_slave.stdout‘,‘r‘)

for line in f.readlines():

if re.search(CountTimeFormat,line):

#获得文件专用锁

fcntl.flock(f_new, fcntl.LOCK_EX)

f_new.writelines(line)

f_new.flush()

#释放文件锁

fcntl.flock(f_new, fcntl.LOCK_UN)

break

while 1:

AfterOneMinute = datetime.timedelta(minutes=MinuteNum)

CountTime = AfterOneMinute+StartTime

CountTimeFormat = CountTime.strftime(‘%Y-%m-%d %H:%M‘)

MinuteNum = MinuteNum+1

count_list.append(CountTimeFormat)

if CountTimeFormat == "2014-04-23 16:00":

break

def exec_cmd():

with futures.ProcessPoolExecutor(max_workers=24) as executor:

dict(( executor.submit(test, times), times) for times in count_list)

if __name__ == ‘__main__‘:

exec_cmd()

f_new.close()python concurrent模块,布布扣,bubuko.com

python3多线程传参_python多线程 怎么传送多个参数相关推荐

  1. python爬虫02-提升爬取效率、多线程,多线程传参,多进程,线程及线程池概念,协程,多任务异步协程,异步请求aiohttp模块,视频站工作原理

    1.提升爬取效率 使用多线程,多进程,携程,异步 2.多线程 进程是资源单位,每个进程,都会有一个默认的主线程 线程是执行单位 执行多线程需要导包: from threading import Thr ...

  2. url 传参时包含或者#号时当成参数解析的问题

    url 传参时包含&或者#号时当成参数解析的问题 当url地址传递参数时,值中一个含有&符号时可能会出现解析错误的情况,最好的解决办法就是将&符号进行replace成其他格式字 ...

  3. c++11 多线程传参和生产者消费者实现

    普通函数传参和成员函数传参 #include <iostream> #include <thread> #include <windows.h> void func ...

  4. python多线程的作用_Python多线程中三个函数的强大功能简介

    在Python多线程中有三个比较简单的函数,在实际的相关操作中你对这一实际操作是否了解?是否对其感兴趣?如果你想对Python多线程的开发与多线程程序及相关实际操作方案有所了解的话,你就可以点击以下的 ...

  5. python多线程共享全局变量_Python多线程-共享全局变量

    多线程-共享全局变量 import threading import time g_num = 200 def test1(): global g_num for i in range(5): g_n ...

  6. python装饰器传参与不传参_Python装饰器不会传参?别着急,这篇文章为你解惑

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第13篇文章,上一篇文章当中我们介绍了Python装饰器的定义和基本的用法,这篇文章我们一起来学习一下Python装 ...

  7. python web框架 多线程和多进程_python 多线程和多进程

    多线程与多进程 知识预览 一 进程与线程的概念 二 threading模块 三 multiprocessing模块 四 协程 五 IO模型 回到顶部 一 进程与线程的概念 1.1 进程 考虑一个场景: ...

  8. 小程序 url 对象转字符串编码传参 url 字符串转对象解码接收参数

    url 对象转字符串编码传参 let info = encodeURI(JSON.stringify(this.data.info));wx.navigateTo({url: '/pages/part ...

  9. 【url传参】之 获取url?后面的参数,对应参数名获取值 和 全量获取转换为对象结构两种方式

    访问你挚爱的强哥_百度搜索https://www.baidu.com/s?wd=%E4%BD%A0%E6%8C%9A%E7%88%B1%E7%9A%84%E5%BC%BA%E5%93%A5&r ...

最新文章

  1. 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
  2. 分享文章《控制情绪,享受人生》
  3. hdu2204 Eddy's爱好 打表+容斥原理
  4. iOS开发之UIWindow
  5. ASP.NET 开发实践--性能与缓存
  6. linux lanmp 安装教程,linux服务器一键安装包lanmp系列教程之一
  7. The Preliminary Contest for ICPC China Nanchang National Invitational
  8. C# WPF MVVM模式下在主窗体显示子窗体并获取结果
  9. cad2016中选择全图字体怎么操作_打开CAD图纸字体丢失、重新选择怎么办?这样设置,一辈子用的到...
  10. NSString 截取字符串
  11. 速成pytorch学习——7天模型层layers
  12. 咖啡html代码,咖啡.html
  13. Qt 实现Windows系统Win10 c++音量调节
  14. 计算机网络安全漏洞排查报告,网络安全漏洞自查报告.docx
  15. windows下编译skia
  16. CSS 权威指南 读书笔记(二)
  17. java实现sug,Java SuggestionResult類代碼示例
  18. 服务器固态硬盘接口区别,s s d固态硬盘和服务器配件硬盘的区别
  19. 20个案例掌握PL/SQL 基础
  20. Docker 安装 SRS

热门文章

  1. 集美大学计算机专业属a类吗,集美大学是不是双一流大学,2020那些是一流大学和一流学科?...
  2. 闲鱼自动抓取/筛选/发送系统 V13发布
  3. 安卓 微信网页缓存清除方法
  4. 数图互通高校房产管理——数据采集与上报
  5. UIBOT使用两周个人见解
  6. 2012年1月凯立德地图普高清全分辨率懒人包P1750-D5616-2721J09(完美破解,已上路实测,永久下载地址)...
  7. ARChon 分析之一:下载使用ARChon
  8. android runtime chrome,ARChon Runtime APK for Chrome_v2.1
  9. veni vidi vici密钥我的生日ACIGS解密_25人在同一天生日!男女比例又是多少?阳光新生大数据来了!...
  10. IDEA2021 JavaWeb项目(WebApplication)快速上手 解决无法解析jsp文件、添加框架中没有WebApplication等问题