Python3——进程与线程

程序并行运算的方法有两种,进程和线程。

进程是相对独立的,在内存里会生成一份副本,所以进程之间相对独立,更改不会直接影响到其他进程中的变量。

线程则运行在进程中,共享线程中的变量。

进程

用fork创建一个新进程。这在windows中不能使用(除非使用cgywin这样的模拟unix环境)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
import time
 
def counter(count):
	for i in range(count):
		print('[{}] : {}'.format(os.getpid(),i))
		time.sleep(0.5)
 
for i in range(5):
	pid = os.fork()
	if pid != 0:
		print('Process {} spawned'.format(pid))
	else:
		counter(5)
		os._exit(0)
 
print('Main process exiting')

线程

线程有两种,一种是使用类c的_thread模块,还有一种是使用threading模块,虽然实现方式不同,但是功能上没什么差异。

用_thread模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import _thread
import time
#如果要确保线程之间的执行顺序,需要分配锁
#mutex = _thread.allocate_lock()
 
def create(num):
	#mutex.acquire()
	for i in range(5):
		time.sleep(0.5)
		print(num,i)
	#mutex.release()
 
num = 0
for i in range(5):
	t = _thread.start_new_thread(create,(num,))
	num += 1
 
#让主进程运行5秒,不然线程还没结束,程序就退出了
time.sleep(5)
print('over')

如果使用threading,有两种方式。一种是直接使用threading对象实例,还有一种是创建派生类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#直接使用threading对象实例
import threading
import time
 
#创建锁
#lock = threading.Lock()
 
def create(num):
	#lock.acquire()
	for i in range(5):
		time.sleep(0.5)
		print(num,i)
	#lock.release()
 
num = 0
for i in range(5):
	t = threading.Thread(target=create,args=(num,))
	t.start()
	num += 1
 
print('over')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#使用threading.Thread的派生类
import threading
import time
 
#lock = threading.Lock()
 
def create(num):
	#lock.acquire()
	for i in range(5):
		time.sleep(0.5)
		print(num,i)
	#lock.release()
 
class myThreading(threading.Thread):
	def __init__(self,num):
		self.num = num
		threading.Thread.__init__(self)
	def run(self):
		create(self.num)
 
num = 0
for i in range(5):
	myThreading(num).start()
	num += 1
 
print('over')

使用了threading模块的线程,一般都会等到线程结束后再结束程序的运行(除非将该线程设为守护线程)。而_thread模块的线程,需要考虑线程运行时间和主进程运行时间的关系。

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注