当前位置:首页 » 编程语言 » 多线程python

多线程python

发布时间: 2022-01-18 00:27:15

1. python多线程和多进程的区别有哪些

python多线程和多进程的区别有七种:

1、多线程可以共享全局变量,多进程不能。

2、多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。

3、线程共享内存空间;进程的内存是独立的。

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

5、创建新线程很简单;创建新进程需要对其父进程进行一次克隆。

6、一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程。

7、两者最大的不同在于:在多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响;而多线程中,所有变量都由所有线程共享。

更多Python知识,请关注:Python自学网!!

2. Python多线程

那是当然。你这样写就可以了
self.p[:]=array

这样写法的含义就是指针不变。只换内容。这样就可以同步了。

你的写法是,新建一个数组,再把指针缎带self.p,如果其它的线程就会出问题。

另外你的p应该放在__init__之前。引用时使用T.p来引用,这样更合理一些。

3. python怎么能同时执行代码(多线程)

多线程不是这个意思。
普通的单线程,比如
代码块A
循环代码块B
循环代码块C
代码块D
程序会按顺序A,B,C,D这样执行,而B循环如果没有结束,C循环不会开始。
如果是多线程,
代码块A
新线程:循环代码块B
循环代码块C
代码块D
这样,B循环新开一个线程运行,原来的线程会继续运行C,B有没有结束,不影响C

4. Python多线程是什么意思

简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。
UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。
如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch
但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。
反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…
如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。
再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:
multiprocessing这个mole有一个mmy的sub mole,它是基于multithread实现了multiprocessing的API。
假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency
from multiprocessing import Pool
如果把这个代码改成下面这样,就变成多线程实现concurrency
from multiprocessing.mmy import Pool
两种方式都跑一下,哪个速度快用哪个就行了。
UPDATE:
刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

5. python多线程的几种方法

Python进阶(二十六)-多线程实现同步的四种方式
临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。
锁机制
threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.lock = threading.Lock() def add(self):
self.lock.acquire()#加锁,锁住相应的资源
self.num += 1
num = self.num
self.lock.release()#解锁,离开该资源
return num

n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item def run(self):
time.sleep(2)
value = n.add()#将num加1,并输出原来的数据和+1之后的数据
print(self.item,value)for item in range(5):
t = jdThread(item)
t.start()
t.join()#使线程一个一个执行

当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念)。
直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。
信号量
信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.sem = threading.Semaphore(value = 3) #允许最多三个线程同时访问资源

def add(self):
self.sem.acquire()#内部计数器减1
self.num += 1
num = self.num
self.sem.release()#内部计数器加1
return num

n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item def run(self):
time.sleep(2)
value = n.add()
print(self.item,value)for item in range(100):

6. python多线程能提高效率吗

很多爬虫工作者都遇到过抓取速度非常慢,现在的大多数网站都具备了反爬虫技术,对IP的访问频率限制很严格。如果想提升爬虫的速度,大家可以尝试以下方法。

一、尽量减少访问次数。
单次爬虫任务的大多耗时在网络请求等待响应,所以能减少网络请求就尽量减少请求,这样既能减少目标网站的压力,也能减少代理服务器的压力,提高工作效率。

二、精简流程,减少重复。
大部分网站并不是严格意义上的树状结构,而是多重交叉的网状结构,所以从多个入口深入的网页会有很多重复,一般根据URL或者ID进行唯一性判别,爬过的就不需要再爬。一些数据如果可以在一个页面内获取到,也可以在多个页面下获取到,那就选择只在一个页面内获取。

三、多线程任务。
大量爬虫是一个IO阻塞的任务,所以采用多线程的并发方式可以有效地提高整体速度。多线程可以更好地提高资源利用率,程序设计也更加坚定,程序响应也更快。

四、分布式任务。
上面三点都做到极致了,但是单机单位时间内能爬取到的网页数量还不足以达到目标,在指定时间内还不能及时的完成任务,那么就只能多机器来同时进行爬虫任务了,这就是分布式爬虫。

做好以上几点,基本可以将爬虫的效率提升大半,另外爬虫代理ip也是不可缺少的尤其是对于量大的任务,IPIDEA提供全球ip的同时更注重保护数据的安全,也可以减少反爬虫策略的触发,一举多得。

7. python 怎么实现多线程的

线程也就是轻量级的进程,多线程允许一次执行多个线程,Python是多线程语言,它有一个多线程包,GIL也就是全局解释器锁,以确保一次执行单个线程,一个线程保存GIL并在将其传递给下一个线程之前执行一些操作,也就产生了并行执行的错觉。

8. python循环怎么用多线程去运行

背景:Python脚本:读取文件中每行,放入列表中;循环读取列表中的每个元素,并做处理操作。
核心:多线程处理单个for循环函数调用
模块:threading
第一部分:

:多线程脚本 (该脚本只有两个线程,t1循环次数<t2)#!/usr/bin/env python#-*- coding: utf8 -*- import sysimport timeimport stringimport threadingimport datetimefileinfo = sys.argv[1] # 读取文件内容放入列表host_list = []port_list = [] # 定义函数:读取文件内容放入列表中def CreateList(): f = file(fileinfo,'r') for line in f.readlines(): host_list.append(line.split(' ')[0]) port_list.append(line.split(' ')[1]) return host_list return port_list f.close() # 单线程 循环函数,注释掉了#def CreateInfo(): # for i in range(0,len(host_list)): # 单线程:直接循环列表# time.sleep(1)# TimeMark = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')# print "The Server's HostName is %-15s and Port is %-4d !!! [%s]" % (host_list[i],int(port_list[i]),TimeMark)# # 定义多线程循环调用函数def MainRange(start,stop): #提供列表index起始位置参数 for i in range(start,stop): time.sleep(1) TimeMark = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print "The Server's HostName is %-15s and Port is %-4d !!! [%s]" % (host_list[i],int(port_list[i]),TimeMark) # 执行函数,生成列表CreateList()# 列表分割成:两部分 mid为列表的index中间位置mid = int(len(host_list)/2) # 多线程部分threads = []t1 = threading.Thread(target=MainRange,args=(0,mid))threads.append(t1)t2 = threading.Thread(target=MainRange,args=(mid,len(host_list)))threads.append(t2) for t in threads: t.setDaemon(True) t.start()t.join()print "ok"

以上是脚本内容!!!
----------------------------------------------------------------------
:读取文件的内容
文件内容:
[root@monitor2 logdb]# cat hostinfo.txt
192.168.10.11 1011
192.168.10.12 1012
192.168.10.13 1013
192.168.10.14 1014
192.168.10.15 1015
192.168.10.16 1016
192.168.10.17 1017
192.168.10.18 1018
192.168.10.19 1019
192.168.10.20 1020
192.168.10.21 1021
192.168.10.22 1022
192.168.10.23 1023
192.168.10.24 1024
192.168.10.25 1025

:输出结果:
单线程 : 执行脚本:输出结果:
[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt
The Server's HostName is 192.168.10.10 and Port is 1010 !!! [2017-01-10 14:25:14]
The Server's HostName is 192.168.10.11 and Port is 1011 !!! [2017-01-10 14:25:15]
The Server's HostName is 192.168.10.12 and Port is 1012 !!! [2017-01-10 14:25:16]
.
.
.
The Server's HostName is 192.168.10.25 and Port is 1025 !!! [2017-01-10 14:25:29]

多线程:执行脚本:输出 结果
[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt
The Server's HostName is 192.168.10.11 and Port is 1011 !!! [2017-01-10 14:51:51]
The Server's HostName is 192.168.10.18 and Port is 1018 !!! [2017-01-10 14:51:51]
The Server's HostName is 192.168.10.12 and Port is 1012 !!! [2017-01-10 14:51:52]
The Server's HostName is 192.168.10.19 and Port is 1019 !!! [2017-01-10 14:51:52]
The Server's HostName is 192.168.10.13 and Port is 1013 !!! [2017-01-10 14:51:53]
The Server's HostName is 192.168.10.20 and Port is 1020 !!! [2017-01-10 14:51:53]
The Server's HostName is 192.168.10.14 and Port is 1014 !!! [2017-01-10 14:51:54]
The Server's HostName is 192.168.10.21 and Port is 1021 !!! [2017-01-10 14:51:54]
The Server's HostName is 192.168.10.15 and Port is 1015 !!! [2017-01-10 14:51:55]
The Server's HostName is 192.168.10.22 and Port is 1022 !!! [2017-01-10 14:51:55]
The Server's HostName is 192.168.10.16 and Port is 1016 !!! [2017-01-10 14:51:56]
The Server's HostName is 192.168.10.23 and Port is 1023 !!! [2017-01-10 14:51:56]
The Server's HostName is 192.168.10.17 and Port is 1017 !!! [2017-01-10 14:51:57]
The Server's HostName is 192.168.10.24 and Port is 1024 !!! [2017-01-10 14:51:57]
The Server's HostName is 192.168.10.25 and Port is 1025 !!! [2017-01-10 14:51:58]

9. 如何写一个多线程的python脚本

#coding=utf-8
importthreading
fromtimeimportctime,sleep

defmusic(func):
foriinrange(2):
print"Iwaslisteningto%s.%s"%(func,ctime())
sleep(1)

defmove(func):
foriinrange(2):
print"Iwasatthe%s!%s"%(func,ctime())
sleep(5)if__name__=='__main__':
music(u'爱情买卖')
move(u'阿凡达')

print"allover%s"%ctime()

10. 为什么有人说 Python 的多线程是鸡肋

因为 Python 中臭名昭着的 GIL。

那么 GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 “1亿” 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?show me the code

那么把 GIL 去掉可行吗?

还真有人这么干多,但是结果令人失望,在1999年Greg Stein 和Mark Hammond 两位哥们就创建了一个去掉 GIL 的 Python 分支,在所有可变数据结构上把 GIL 替换为更为细粒度的锁。然而,做过了基准测试之后,去掉GIL的 Python 在单线程条件下执行效率将近慢了2倍。

Python之父表示:基于以上的考虑,去掉GIL没有太大的价值而不必花太多精力。

热点内容
vs2012添加文件夹 发布:2024-12-27 13:01:27 浏览:899
c语言统计单词数 发布:2024-12-27 12:58:09 浏览:57
手机服务密码怎么知道 发布:2024-12-27 12:51:44 浏览:465
oraclelinux使用 发布:2024-12-27 12:46:04 浏览:481
相册密码在哪里开 发布:2024-12-27 12:40:29 浏览:270
压缩解压支持库 发布:2024-12-27 12:31:46 浏览:712
php过滤注入 发布:2024-12-27 12:26:48 浏览:842
安卓手机怎么看手机配置 发布:2024-12-27 12:25:54 浏览:34
winccc脚本属性函数 发布:2024-12-27 12:25:15 浏览:61
安卓怎么设置照片格式 发布:2024-12-27 11:50:05 浏览:169