python 基础:线程 和 进程

  • 进程:一个程序的执行实例, 地址空间,内存,数据栈,辅助数据(独立的)。在主线程中
  • 线程: 同一进程中,信息共享和通信。访问差异会导致结果不一致。
    python 程序中由global interpreter lock(GIL),主循环中要求只能有一个控制线程运行。

线程

threading 实现线程

import time
import threading
# threading.Thread() 是线程

# 每个线程的内容, 等待n秒
def worker(n):
	print('函数执行开始于:{} '.format(time.ctime()))
	time.sleep(n)
	print('函数执行结束于:{}, 线程名:{}'.format(time.ctime(),threading.current_thread().name))

# 继承threading.Thread,重写run(): 线程执行接口
class MyThread(threading.Thread)def __int__(self, func, args):
		threading.Thread.__init__(self)
		self.func = func
		self.args = args

	# start 启动
	def run(self):
		# 解包
		self.func(*self.args)

# 主函数,生成两个线程对象,入线程池threads,.start() 开始, .join() 守护线程,主函数等子线程全部执行后在结束。
def main():
	print('[主函数执行开始于:{}]'.format(time.ctime()))
	threads = []
	t1 = MyThread(worker, (4,))
	threads.append(t1)

	t2 = MyThread(worker, (2,))
	threads.append(t2)

	for t in threads:
		t.start()

	for t in threads:
		t.join()
	print('[主函数执行结束于:{}]'.format(time.ctime()))

if __name__ == '__mian__':
	main()

生产者,消费者实例

import threading
import queue
import time
import random

# 生成者, 产生随机数到 data_queue 队列中, data_queue.put()
def producer(data_queue):
	for i in range(5):
		time.sleep(0.5)
		item = random.randint(1, 100)
		data_queue.put(item)
		print("{} 在队列中放入数据项 {}".format(threading.current_thread().name, item))

# 消费者,从队列中取出一个数,data_queue.task_done()
def consumer(data_queue):
	while True:
		try:
			item = data_queue.get(timeout=3)
			print('{} 从队列中移除了'.format(threading.current_thread().name))
		except queue.Empty:
			break
		else:
			data_queue.task_done()
# 主函数,生成4个线程到线程池,2个生成者,2个消费者。
def main():
	q = queue.Queue()
	threads = []

	p = threading.Thread(target=producer, args=(q,))	
	p.start()

	for i in range(2):
		c = threading.Thread(target=consumer, args=(q,))
		threads.append(c)

	for t in threads:
		t.start()

	for t in threads:
		t.join()

	q.join()
	
main()

线程同步

同步原语(锁)

import time
import threading
import random

eggs = []
lock = threading.Lock()

def put_egg(n, lst):
	# lock.acquire()
	with lock:
		for i in range(1, n+1):
			time.sleep(random.randint(0,2))
			lst.append(i)
	# lock.release()

def main():
	threads = []
	for i in range(3):
		t = threading.Thread(target= put_egg, args=(5, eggs))
		threads.append(t)

	for t in threads:
		t.start()
	for t in threads:
		t.join()
	print(eggs)

main()

进程

进程,线程,线性执行速度对比。

import time
import concurrent.futures


numbers = list(range(1,7))

def count(n):
	for i in range(10000000):
		i += 1
	return i*n

def worker(x):
	result = count(x)
	print('数字:{}的计算结果为:{}'.format(x, result))

# 顺序执行
def sequential_excution():
	start_time = time.clock()

	for i in numbers:
		worker(i)
	print('顺序执行花费时间:{} 秒'.format(time.clock()-start_time))

# 线程执行
def thread_execution():
	start_time = time.clock()
	with concurrent.futures.ThreadPoolExecutor(max_workers=5) as excuter:
		for i in numbers:
			excuter.submit(worker, i)

	print('多线程执行花费时间: {}'.format(time.clock()-start_time))


# 多进程 进程池执行
def process_excution():
	start_time = time.clock()
	with concurrent.futures.ProcessPoolExecutor(max_workers=1) as excuter:
		for i in numbers:
			excuter.submit(worker, i)
	
	print('多进程执行花费时间: {}'.format(time.clock()-start_time))

if __name__ == '__main__':
	# sequential_excution()
	# thread_execution()
	process_excution()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值