Khóa tập lệnh python

Các hướng dẫn được cung cấp mô tả cách khóa tập lệnh Python để không thể chỉnh sửa tập lệnh đó. Khi tập lệnh sẽ được chia sẻ nhưng mã cần không thay đổi, hãy biên dịch tệp PY thành tệp PYC. Điều này đảm bảo rằng người dùng không thể thực hiện bất kỳ thay đổi nào đối với mã hiện có trong tập lệnh. Tệp PYC có bản chất là nhị phân và không thể đọc trực tiếp

Thủ tục

Dưới đây là mã biên dịch tệp PY thành tệp PYC

Note:
PYC files run even if the PY files are not present.
Code:
import py_compile

script = "C:\\temp\\myscript.py"
py_compile.compile(script)

Mã này có thể được nhập dưới dạng tệp PY của chính nó hoặc có thể được nhập vào Cửa sổ ngay lập tức của PythonWin

Bạn dùng máy tính hàng ngày, mở hàng ngàn trang web khác nhau, cùng một cơ số đếm không xuể các ứng dụng nghe nhạc, xem phim, game ở bên ngoài, bạn có tự hỏi vì sao máy tính có thể cân nhắc hết việc đâu. . Nhưng thực tế ảo diệu hơn thế nhiều, hóa ra, trong một đơn vị thời gian (nano giây), chỉ có một chương trình (tiến trình) được chạy. Và trong chương trình đó, chia lại thành nhiều luồng (luồng) con, thực thi cùng một lúc (đa luồng, ít nhất là trong thời điểm hiện tại), tạo cho người dùng cảm giác chương trình đang chạy nhanh hơn. Nhờ khả năng xử lý các nhiệm vụ có thể coi như đồng thời (concurrency), chương trình có thể đáp ứng tốt cho người dùng khi đang bận rộn với công việc khác. Và đó chính là ý tưởng cơ bản của đa luồng

1. Luồng (chỉ) là gì ?
  • Nói về cấu trúc máy tính. Chủ đề là một đơn vị cơ bản trong CPU. Một luồng sẽ chia sẻ với các luồng khác trong cùng quá trình về thông tin dữ liệu, dữ liệu của mình. Việc tạo ra luồng giúp các chương trình có thể chạy được nhiều công việc cùng một lúc
  • Process is too active your application. Tiến trình (quy trình)chứa biến thông tin tài nguyên, trạng thái thực hiện của chương trình
  • Chủ đề là một bước điều hành bên trong một quy trình. Luồng (luồng) là một khối lệnh (chỉ dẫn) độc lập trong một tiến trình và có thể được lập lịch bởi hệ thống điều hành. Hay nói một cách đơn giản, Chủ đề là các chức năng hay thủ tục chạy độc lập đối với chương trình chính. Dĩ nhiên là một tiến trình có thể chứa nhiều luồng bên trong nó. Điểm quan trọng nhất cần lưu ý là một luồng có thể thực hiện bất kỳ nhiệm vụ nào mà một quy trình có thể thực hiện
  • Một điểm khác biệt nữa đó là nhiều luồng nằm trong cùng một tiến trình sử dụng một khoảng không gian bộ nhớ giống nhau, trong khi tiến trình thì không. Điều này cho phép các thread đọc và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp dễ dàng giữa các thread với nhau. Giao thức giữa các tiến trình, hay còn gọi là IPC (giao tiếp giữa các tiến trình) thì tương đối phức tạp bởi các dữ liệu có tính tập trung sâu hơn. Ngoài các tài nguyên riêng của mình (các biến cục bộ trong hàm), các luồng chia sẻ tài nguyên chung của tiến trình. Việc thay đổi tài nguyên chung (ví dụ, đóng tệp, gán giá trị mới cho biến) từ một chủ đề sẽ được nhìn thấy bởi tất cả các chủ đề khác. Vì vậy, lập trình viên cần phải thực hiện đồng bộ công việc truy cập tài nguyên chung giữa các luồng
  • Hình bên dưới minh họa có sự khác nhau giữa luồng và tiến trình.
    Khóa tập lệnh python

Đây là nhưng kiến ​​thức trung xuất phát từ máy tính nói chung, đến các ngôn ngữ lập trình nói riêng thì những khái niệm này cũng tương tự như vậy

2. Đa luồng (Đa luồng) là gì

Một chương trình đa luồng bao gồm hai hoặc nhiều phần có thể chạy đồng thời và mỗi phần có thể xử lý các tác vụ khác nhau tại cùng một thời điểm, để sử dụng tốt nhất các nguồn có sẵn, đặc biệt khi máy tính của bạn

Python cung cấp Mô-đun luồng và Mô-đun luồng để bạn có thể bắt đầu một luồng mới cũng như một số tác vụ khác trong khi thiết lập trình đa luồng. Mỗi chủ đề đều có vòng đời chung là bắt đầu, chạy và kết thúc. Một Chủ đề có thể bị ngắt (ngắt), hoặc tạm thời bị dừng (ngủ) trong khi các Chủ đề khác đang chạy – được gọi là năng suất

Một ví dụ đơn giản chỉ sử dụng một luồng, có tham số truyền. To run thread, ta used method start(). Mục tiêu sẽ là chức năng myThread, là nhiệm vụ mà luồng phải hoàn thànhDư. This is a process program running normal

import time

def cal_square(numbers):
	print("calculate square number")
	for n in numbers:
		time.sleep(0.2)
		print ('square:', n*n)

def cal_cube(numbers):
	print("calculate cube number")
	for n in numbers:
		time.sleep(0.2)
		print ('square:', n*n*n)

arr = [2,3,7,9]
t = time.time()
cal_square(arr)
cal_cube(arr)
print ("done in ", time.time()- t)

Khóa tập lệnh python

Còn đây là chương trình chạy đa luồng

from threading import Thread
import threading
import time


def cal_square(numbers):
	print("calculate square number")
	for n in numbers:
		time.sleep(0.2)
		print ('square:', n*n)


def cal_cube(numbers):
	print("calculate cube number \n")
	for n in numbers:
		time.sleep(0.2)
		print ('cube:', n*n*n)

arr = [2,3,7,9]

try:
	t = time.time()
	t1 = threading.Thread(target=cal_square, args=(arr,))
	t2 = threading.Thread(target=cal_cube, args=(arr,))
	t1.start()
	t2.start()
	t1.join()
	t2.join()
	print ("done in ", time.time()- t)
except:
	print ("error")

Khóa tập lệnh python

có thể thấy các luồng chạy đồng thời song song với nhau, không cần chạy các lần như tuần tự như process nữa , với luồng 1 chạy với độ trễ là 2s và với luồng 2 là 3s. Nếu chạy process thì tài nguyên có thể khác nhau,cấu trúc khác nhau, kết quả khác nhau và hoạt động theo tuần tự , còn đa luồng thì các luồng có thể cấu trúc giống nhau , tài nguyên sử dụng ít hơn

from threading import Thread
import time


class myThread(Thread):
 	"""docstring for myThread"""
 	def __init__(self, name, counter, delay):
 		super(myThread, self).__init__()
 		self.name= name
 		self.counter=counter
 		self.delay=delay

 	def run(self):
 		print "san sang chay" + self.name
 		while self.counter:
 			time.sleep(self.delay)
 			print "%s: %s" % (self.name, time.ctime(time.time()))
 			self.counter-=1
 		print "ket thuc vong lap", self.name

try:
 	thread1 = myThread("thread 1", 10, 2)
 	thread2 = myThread("thread 2", 10, 3)
 	thread1.start()
 	thread2.start()
except:
 	print "Error"

kết quả

Khóa tập lệnh python

Mặc dù module threading rất hiệu quả với multi-stream tầm thấp nhưng khi so sánh với module threading thì nó có nhiều điểm hạn chế. Phần tiếp theo giới thiệu về Threading Module

Module Threading cung cấp nhiều hỗ trợ mạnh mẽ và mức độ cao hơn cho các Thread trong khi so sánh với Thread Module ở trên. Ngoài các phương thức có trong thread Module, thì threading Module còn bổ sung thêm một số phương thức khác, đó là

  • xâu chuỗi. activeCount(). Trả về số lượng chủ đề đang hoạt động
  • luồng. currentThread(). Trả về số đối tượng thread trong Thread control của Caller
  • luồng. liệt kê(). Trả về một danh sách tất cả các luồng đối tượng hiện đang hoạt động

Bên cạnh đó, phân luồng Module có lớp Chủ đề để phát triển đa luồng. This class has the following method

  • chạy(). Là điểm vào cho một chủ đề
  • bắt đầu(). Start a thread by run() method call
  • tham gia([thời gian]). Chờ đợi các thread kết thúc
  • isAlive(). Kiểm tra xem một chủ đề có đang được thực thi hay không
  • getName(). Trả về tên của một chủ đề
  • đặt tên(). Set up name of a thread

Có một số câu hỏi về việc nếu các luồng được giao việc và chạy như vậy thì muốn dừng các luồng lại thì phải làm sao. That is used daemon thread. Chủ đề daemon thường được sử dụng khi không còn cách đơn giản nào có thể dừng chủ đề này (ví dụ như vòng lặp nguyên bản), hoặc ngắt giữa chủ đề chính xác mà không làm ảnh hưởng đến dữ liệu. Ta có thể bắt một luồng đang chạy trong chế độ daemon bằng cách sử dụng phương thức setDaemon(True)

import threading
import time
 
def daemon():
    print (threading.currentThread().getName(), 'Starting')
    time.sleep(2)
    print (threading.currentThread().getName(), 'Exiting')
 
def non_daemon():
    print (threading.currentThread().getName(), 'Starting')
    print (threading.currentThread().getName(), 'Exiting')
 
d = threading.Thread(name='daemon', target=daemon)
d.setDaemon(True)
t = threading.Thread(name='non_daemon', target=non_daemon)
 
d.start()
t.start()

Khóa tập lệnh python

3. Đồng bộ hóa các Chủ đề trong Python

Trong quá trình thiết lập luồng đa luồng, các luồng chia sẻ tài nguyên chung của tiến trình, vì vậy có những thời điểm nhiều luồng sẽ đồng thời thay đổi dữ liệu chung. Do đó, ta cần những cơ chế để đảm bảo rằng, tại một thời điểm chỉ có duy nhất một luồng được phép truy cập vào dữ liệu chung, nếu các luồng khác muốn truy cập vào đoạn dữ liệu này thì cần phải chờ chủ đề

Python cung cấp Mô-đun phân luồng, trong đó bao gồm một kỹ thuật khóa cho phép bạn đồng bộ hóa các Chủ đề một cách dễ dàng. Một khóa mới được tạo theo cách gọi Lock()

Phương thức thu nhận (chặn) của khóa đối tượng mới này được sử dụng để ép các Chủ đề chạy một cách đồng bộ. Tham số chặn tùy chọn cho bạn khả năng điều khiển để xem một chủ đề cần chờ đợi để đạt được khóa hoặc không

Nếu tham số chặn được thiết lập là 0, tức là Chủ đề ngay lập tức trả về giá trị 0 nếu không bị khóa và trả về giá trị 1 nếu bị khóa. Nếu chặn được thiết lập là 1, thì Chủ đề cần đợi cho đến khi khóa được giải nén

Phương thức giải phóng () của khóa đối tượng được sử dụng để giải nén khóa khi nó không cần thiết nữa

4. Ứng dụng đa luồng

Đa luồng có rất công dụng vô cùng hữu ích thích hợp cho những nhiệm vụ chạy tàu ngầm không cần quan tâm chính xác thời gian hoàn thành, nghe có vẻ giống cronjob nhỉ =)) nhưng điểm đặc biệt nhất của nó vẫn là chạy song song . Ví dụ dự án của mình có nhiệm vụ bao gồm nhiều ưu đãi , người dùng muốn lưu ưu đãi đó để sử dụng lần sau thì cần ghi nhật ký 2 sự kiện bao gồm xem nhật ký và lưu nhật ký