python学习笔记(二十七)python的线程操作

目录

一、线程创建:

二、线程数据共享:

三、线程锁

四、线程调度

五、线程通信

六、定时线程

七、生产者与消费者

八、客户端与服务器数据交互

1、服务器:

2、客户端一

3、客户端二


一、线程创建:

import threading
import time


def run():
	print('子线程%s启动' % (threading.current_thread().name))
	# 实现线程功能
	print('打印')
	time.sleep(1)

	print('子线程%s结束' % (threading.current_thread().name))


if __name__ == '__main__':
	# 任何进程默认就会启动一个线程,称为主线程,主线程可以启动新的子线程
	# current_thread():返回当前线程的实例
	print('主线程%s启动' % (threading.current_thread().name))

	# 创建子线程
	t = threading.Thread(target=run, name='runthread')
	t.start()
	# 等待线程结束
	t.join()
	print('主线程%s结束' % (threading.current_thread().name))

二、线程数据共享:

#多进程和多线程最大的不同在于:多进程中,同一个变量,各自有一份拷贝在每个进程中,互不影响。多线程中,所有变量都由所有线程共享。所以任何一个变量都可以被任意一个线程修改。因此线程之间最大的危险在于同时修改一个变量容易把内容改乱了。


import threading
import time

n = 100


def run():
	global n
	n = n + 20
	print('run:', n)


def fun():
	global n
	n = n / 10
	print('fun:', n)


if __name__ == '__main__':
	# 创建子线程
	t = threading.Thread(target=run, name='runthread')
	t.start()
	t.join()
	k = threading.Thread(target=fun, name='funthread')
	k.start()

三、线程锁

#作用:为每一个线程绑定一个数据库链接
import threading
import time

num = 0
# 创建一个全局的threadLocal对象
# 每个线程有独立的存储空间
# 每个线程对threadLocal对象都可以读写,但是互不影响
local = threading.local()
#list = [num, num]


def run(x, n):
	x = x + n
	x = x - n


def fun(n):
	# 每个线程都有一个local.x,就是线程的局部变量
	local.x = num
	for i in range(100000):
		run(local.x, n)
	print('%s--%d' % (threading.current_thread().name, local.x))


if __name__ == '__main__':
	# 创建子线程
	t = threading.Thread(target=fun, args=(6,))
	t2 = threading.Thread(target=fun, args=(9,))
	t.start()
	t2.start()
	t.join()
	t2.join()
	print('num = ', num)

四、线程调度

#调度两个线程之间的执行顺序

import threading, time

# 线程条件变量
cond = threading.Condition()


def run1():
	with cond:
		for i in range(0, 10, 2):
			print(threading.current_thread().name, i)
			time.sleep(1)
			# 运行一次然后等待run2信息
			cond.wait()
			cond.notify()


def run2():
	with cond:
		for i in range(1, 10, 2):
			print(threading.current_thread().name, i)
			time.sleep(1)
			# 给run1发送信息
			cond.notify()
			# 等待
			cond.wait()


threading.Thread(target=run1).start()
threading.Thread(target=run2).start()

五、线程通信

import threading, time


def fun():
	# 事件对象
	event = threading.Event()

	def run():
		for i in range(5):
			# 阻塞,等待事件的触发
			event.wait()
			# 重置
			event.clear()
			print('what happen ...%d' % i)

	t = threading.Thread(target=run).start()
	return event


e = fun()
# 触发事件
for i in range(5):
	e.set()
	time.sleep(1)

六、定时线程

import threading

def run():
	print("sunck is a bad man")

#延时执行线程
t = threading.Timer(5,run)
t.start()
t.join()
print("父线程结束")

 

七、生产者与消费者

#4个生产者在生产数据   3个消费者将生产的数据从队列中取出
import threading, time, queue, random


# 生产者
def product(id, q):
	while True:
		num = random.randint(0, 10000)
		q.put(num)
		print('生产者%d生产了%d数据放入了队列' % (id, num))
		time.sleep(3)
	# 任务完成
	q.task_done()


# 消费者
def customer(id, q):
	while True:
		item = q.get()
		if item is None:
			break
		print('消费者%d消费了%d数据' % (id, item))
		time.sleep(2)
	# 任务完成
	q.task_done()


if __name__ == '__main__':
	# 消息队列
	q = queue.Queue()
	# 启动生产者  4
	for i in range(4):
		threading.Thread(target=product, args=(i, q)).start()
	# 启动消费者  3
	for i in range(3):
		threading.Thread(target=customer, args=(i, q)).start()

八、客户端与服务器数据交互

1、服务器:

import socket
import threading

#创建一个socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定IP和端口
server.bind(('192.168.1.103',8080))
#监听
server.listen(5)

print('服务器启动成功......')
# print(str(clientSocket),clientAddress)

def run(ck):
    data = clientSocket.recv(1024)
    print('收到数据:' + data.decode('utf-8'))
    #sendData = input("输入返回给客户端的数据")
    clientSocket.send("hello,this is server".encode('utf-8'))


while True:
    # 等待链接
    clientSocket, clientAddress = server.accept()
    #print("%s--%s链接成功"%(str(clientSocket),clientAddress))
    t = threading.Thread(target=run,args=(clientSocket,))
    t.start()

2、客户端一

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.1.103',9876))

count = 0
while True:
	count += 1
	data = input('请输入给服务器发送的数据')
	client.send(data.encode('utf-8'))
	info = client.recv(1024)
	print('服务器说:', info.decode('utf-8'))

3、客户端二

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.1.103', 8080))

count = 0
while True:
	count += 1
	data = input('请输入给服务器发送的数据')
	client.send(data.encode('utf-8'))
	info = client.recv(1024)
	print('服务器说:', info.decode('utf-8'))

 

你可能感兴趣的:(python)