ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

python-进程补充和线程理论

2022-01-14 17:35:37  阅读:126  来源: 互联网

标签:__ name python number cat print 线程 进程 dict


image

僵尸进程与孤儿进程

僵尸进程
进程代码运行结束之后并没有直接结束而是需要等待收回子进程资源才能结束。
孤儿进程
主进程已经死亡(非正常)但是子进程还在运行

守护进程

守护某个进程,一旦这个进程结束那么也随之结束
from multiprocessing import Process
import time


def judy(name):
	print('%s is working ' % name)
	time.sleep(1)
	print('%s finished her work')


if __name__ == '__main__':
	p = Process(target=judy, args=('judy',))
	p.daemon = True  ### 这个命令是将开启的进程变成主进程的守护进程
	p.start()
	print('who is first')

互斥锁

在并发的情况下,如果操作同一份数据的话,极其容易造成数据错乱,那么只有将并发变成串行,虽然降低了效率但是提升了数据安全。

举个例子:

import json
from multiprocessing import Process


def check(name):
	with open(r'test.txt', 'r', encoding='utf8') as f:
		data_dict = json.load(f)
		cat_number = data_dict['cat']
		print('%s查看了余票,还有:%s张' % (name, cat_number))


def buy(name):
	with open(r'test.txt', 'r', encoding='utf8') as f:
		data_dict = json.load(f)
		cat_number = data_dict['cat']
		if cat_number > 0:
			cat_number -= 1
			data_dict['cat'] = cat_number
			with open(r'test.txt', 'w', encoding='utf8') as f:
				json.dump(data_dict, f)
				print('%s 抢到了票,余票剩余 %s' % (name, cat_number))
		else:
			print('没有票了没有票了')


def run(name):
	check(name)
	buy(name)


if __name__ == '__main__':
	for i in range(2):
		p = Process(target=run,args=(i,))
		p.start()

结果:

image
所以这样是不行的,必须得加上互斥锁!!

正确的版本应该是这样的!!!!!

import json
from multiprocessing import Process, Lock


def check(name):
	with open(r'test.txt', 'r', encoding='utf8') as f:
		data_dict = json.load(f)
		cat_number = data_dict['cat']
		print('%s查看了余票,还有:%s张' % (name, cat_number))


def buy(name):
	with open(r'test.txt', 'r', encoding='utf8') as f:
		data_dict = json.load(f)
		cat_number = data_dict['cat']
		if cat_number > 0:
			cat_number -= 1
			data_dict['cat'] = cat_number
			with open(r'test.txt', 'w', encoding='utf8') as f:
				json.dump(data_dict, f)
				print('%s 抢到了票,余票剩余 %s' % (name, cat_number))
		else:
			print('没有票了没有票了')


def run(name, mutex):
	check(name)
	mutex.acquire()
	buy(name)
	mutex.release()


if __name__ == '__main__':
	mutex = Lock() #在主进程里面产生锁
	for i in range(2):
		p = Process(target=run, args=(i, mutex)) ###要把锁穿进去!!!!
		p.start()

结果

image

标签:__,name,python,number,cat,print,线程,进程,dict
来源: https://www.cnblogs.com/JudyJU/p/15802740.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有