King of Find more than VLOOKUP, do you know for CP functions?

During our daily tabulation, it is often used.Find the work of reference related data.

In fact, this is also one of most small partners in touch.

For example, according to the corresponding results of the employee name, according to the number of item numbers in one item, the corresponding sales, etc.

Today, I will introduce you to a very powerful function combination to achieve this feature.

They are INDEX + MATCH combination.

The specific application scenario is as follows:

01 正 正 查

The correct point here is:Find reference target values ??from left to right.

That is, the lookup value is on the left and the return value is on the right.

As shown below, it is the performance watch of the company employee in the first quarter. We now want to find the corresponding performance according to the name.

Write the following formula in [F2] cell:

=INDEX (C2: C7, Match (E2, B2: B7, 0)))

Formula analysis:

First look up Liu Yan in the [B2: B7] in the [B2: B7], return to the number 2;

This number 2 is then used as the second parameter of the index function, meaning returning to the value of the first parameter in the cell area in the cell area in the cell region.

There are three parameters: Match functions:

Match (lookup value, find area, lookup type)

The MATCH function is specifically used to find a value, where you are in a region or group, and return a number.

This number that is usually returned as a parameter of other functions.

Here, the returned numbers are used as the parameter of INDEX.

If the lookup type of the third parameter is 0, it means an exact lookup.

INDEX usually has three parameters:

Index (Returned area, line number, list number)

Since the first parameter is a single line or a single column, the third parameter can be omitted.

If you don’t illegally, the formula can be written as this:

=INDEX (C2: C7, Match (E2, B2: B7, 0), 1)

02 reverse lookup

The reverse refer to it here is:Find reference target values ??from right to left.

That is, the lookup value is on the right, the return value is on the left.

Also as examples above, for example, we want to find Liu Yan’s employee number.

The formula is as follows:

=INDEX (A2: A7, MATCH (E2, B2: B7, 0)))

Formula analysis:

The formula of this formula is similar to the formula of the forward look, but the first parameter of the index function will change the returned area into the [A2: A7] area.

It can be seen that whether it is looking for a look, it is the same.

Just change the area of ??the first parameter of the index function into the area that needs to return.

03 two-way lookup

The two-way refers herein is:Find the reference target value from the horizontal and vertical two directions.

As shown below: It is a quarter employee payment message, and now I need to find how much Liu Yan’s salary in March is.

The formula is as follows:

=INDEX (B3: D8, Match (G3, A3: A8, 0), Match (H2, B2: D2, 0))

Formula analysis:

First look up Liu Yan in [A3: A8] in the vertical position in [A3: A8], return to the number 2;

Then use the second Match function to find the horizontal position in [B2: D2] in this area, return to the number 3;

Finally, the two numbers are respectively used as the second and third parameters of the INDEX function, meaning returning to the INDEX first parameter [B3: D8] zone "Chapter 3 of the third row in the area of ??this intersection cell, namely: 8606.

Because the two-way lookups here need to involve the position in both directions, we are hereUse two MATCH functions to locate the lines and columns.

04 more conditions

Multi-conditional lookup refers to: Find back to the corresponding target value based on 2 or more conditions, which is often used in our daily work.

As shown below: It is a sales list of all item numbers in all regions. We want to find how much the number of item numbers BH003 in Nanjing is.

Condition 1: Nanjing;

Conditions 2: The item number is BH003.

Write the following formula in the [G2] cell:

=INDEX (C2: C7, Match (E2 & F2, A2: A7 & B2: B7, 0))

Formula analysis:

The basic frame of the formula is the same as above, just first connect two conditions into a new condition form with a "&" text connection;

Then follow the ideas looking forward to the looks to the lookup and return to the sales volume in the [C2: C7] area.

Match function Find the location of "Nanjing BH003" in the newly generated array:

Match ("Nanjing BH003", 0)

Returns the number 3, then this number 3, as the second parameter of the index function, means returning the INDEX first parameter [C2: C7] The value in the cell in the cell area, that is, 72.

?

Because this is an array formula, the formula needs to be ended in the [Ctrl + Shift + Enter] three key. The braces outside the formula will be automatically generated. For small friends who use Office 365, you can end up with a three-key.

Of course, the multi-conditional lookups here can also be applied at both horizontal and vertical two directions.

In addition, no matter how many conditions, just connect multiple conditions to a new condition with a "&" text connector first, then apply the above routine.

05 interval lookup

The interval lookup refers to:If the lookup value is in a certain range, the corresponding target value is returned.

As shown below, the number of bonuses from the employee is required according to the performance interval.

Write the following formula in the [G2] cell:

=INDEX (J2: J5, Match (F2, {0; 41; 81; 121}, 1)))

Formula analysis:

This formula is especially the application of the second and third parameters of the MATCH function.

If the third parameter is 1 or omitted, the MATCH function will look for the maximum of less than or equal to the first parameter, andThe value in the second parameter must be sorted in ascending order.

The maximum value of less than 65 is 41, 41 in this constant array ({0; 41; 81; 121}) is 2, that is, the number 2 is returned to the number 2, and then the index second parameter is finally returned 2000.

Of course, here we can also write this constant number in an auxiliary column, which may be better understood.

As shown below:

06 blurry look

The fuzzy look is to realize the target value by combining with the wildcard ("?" Question mark and "*" asterisk).

As shown below: We want to find a surname Xu to open his head, and how much is the employee number of three characters.

The formula is as follows:

=Index (A2: A7, Match (E2 & "", B2: B7, 0))

Formula analysis:

Here is the key to the Match function supports the usage of wildcard.

Everyone must pay attention to:

"?" Question mark wildcard, represent any single character.

"*" Asterisk wildcard, represents any number of characters.

Here we used two "??" question marks, represent any two characters.

07 summary

Today, we have learned two powerful function combinations (INDEX + MATCH)Six kinds of findings commonly used in work:

? Positive lookup;

? Anti-(reverse) lookup;

? Two-way lookup;

Multi-conditional lookup;

Area lookup;

? Fuzzy lookup.

What is the most look for you usually use? What do you have any questions about VLOOKUP?

Welcome to usmessageOh ~

iPhonese3 release time new message, A15 processor price touching

Apple usually releases a new iPhone phone in September, such as the iPhone13 series of mobile phones introduced in September this year, except for the general iPhone mobile phone, Apple will also launch the iPhonese series mobile phone.

iPhonese series mobile phone is Apple’s low-cost iPhone mobile phone, using small screen design, iPhonese series mobile phone is also known for users, such as Apple’s iPhonese2 mobile phone, unfortunately iphonese2 Mobile phone does not support 5G Internet access.

According to foreign media Macrumors, the latest report, the latest report, showing Apple’s words in the first quarter of next year, and the specific time is expected to be launched at the end of March next year.

According to Apple, I broke the news, the new iPhone is designed in appearance or the iPhone old model, based on iPhone8, equipped with a 4.7-inch screen.

Of course, the IPHONESE series is not its highlight. The brightest of the iPhonese series is hardware configuration and cheap prices. The iPhonese3 mobile phone will be equipped with more powerful processors to support 5G Internet, iPhonese3 mobile phone will be equipped with A15 processor Gao Tong X60 modem, iPhonese3 mobile phone is expected to be the cheapest 5G version of iPhone.

Three minutes learn the wire to withstand the current estimation, knowing this is called electricity

Work temperature is 30 ° C, and the amount of carrier flow under the long-term continuous 90% load is as follows:

1.5 square millimeters – 13A

2.5 square millimeters – 26A
4 square millimeters – 32A

6 square millimeters – 47A
16 square millimeters – 92A

25 square millimeters – 1220A

35 square millimeters – 150A

Current conversion power:

1A=220W,

10A=2200W,

So on and so forth.

For example, if the carrier traffic is 14A, it is: 220W × 14=3080W, then 1.5 square copper wire power is 3.08 kW.

Long-term current allowed by national standard:

4 square is 25-32A

6 square is 32-40A

In fact, these are the theoretical security values, and the limit value is more than these.

The maximum power allowed by the 2,5 square copper wires is: 5500W.

4 square 8000W, 6 square 9000W is no problem.

40A’s digital meter is normal 9000W absolutely no problem. The 12000W of the machine will not be burned.

03

Copper wire wires allow long-term current:

2.5 square millimeters (16A ~ 25A)
4 square millimeters (25A ~ 32A)
6 square millimeters (32A ~ 40A)

for example :

1. Each computer consumes approximately 200 ~ 300W (about 1 to 1.5a), then 10 computers need a 2.5-square millimeter copper wire power supply, otherwise a fire may occur.

2, the large 3 air conditioner consumption is approximately 3000W (about 14a), then one air conditioner requires a separate 2.5 square millimeter copper wire power supply.
3, the current housing outlet is generally 4 square millimeters of copper wire, so the home appliances open at the same time must not exceed 25A (ie 5500 watts), some people replace the wires in the house to 6 square millimeters copper wires are useless. Because the wires entering the meter are 4 square millimeters.
4. Early housing (15 years ago) The import line is generally 2.5 square millimeter aluminum wire, so the home appliances open at the same time must not exceed 13A (ie 2800 watts).

5, household appliances that are relatively large consumption are: air conditioner 5a (1.2), electric water heater 10a, microwave oven 4a, rice cooker 4a, dishwasher 8a, drying machine 10a with drying function, electric heater 4a.

Among the fire caused by the power supply, it is due to the heat of the hair, so all the joints must be welded, and the contact devices that cannot be welded 5 to 10 years must be replaced (such as socket, air switch, etc.).

04

Copper wire wire cable traffic standard cable flow oral estimation:

Take the next two o’clock in nine, and go to the next time.

Thirty-five take three o’clock, double bunom group is five.

The conditions have changed, and the high temperature is 10% off copper upgrade.

The number of tube is two or three four and eight seven six folds.

illustrate:

This mouth is not directly pointed out to various insulated lines (rubber and plastic insulation lines), but "cross-section is multiplied in a certain number" to be represented.

"Two five-point multiply by nine, go to the next time," said that various cross-sectional aluminum insulation lines of 2.5mm2 and below are about 9 times the number of carriers of the cross-section. Such as 2.5mm2 wires, the carrier flow is 2.5 × 9=22.5 (a). The multiple relationship between the carriage of 4mm2 and more wires and the number of cross-section is row, the line number is row, the multiple is successively reduced by 1, i.e., 4 × 8, 6 × 7, 10 × 6, 16 × 5, 25 × 4.

"Thirty-five Take Three Fiveth, Double Bunction] Say", it is said that 35mm2 lead traffic is 3.5 times the number of cross-section, ie 35 × 3.5=122.5 (a). Wire from 50 mm 2 and above, the multiple relationship between the amount of carrier flow and the number of cross-section becomes a set of two two lines, and the multiple is 0.5. That is, 50, 70mm2 wire has a total of 3 times the number of cross-section; 95, 120 mm2 lead traffic is 2.5 times the number of cross-sectional area, and push it according to the secondary.

"Conditions have changed, high temperature nine fold copper upgrades". The above mouth is the copper core insulation line, which is determined under the condition of 25 ° C in ambient temperature. If the aluminum core insulation line is in the area where the ambient temperature is higher than 25 ° C, the wire carrier flow can be calculated according to the above-mentioned oral calculation method, and then hits it again; when used is not an aluminum wire but the copper core insulation line, Its carrier flow is slightly larger than the same size aluminum wire, and can calculate a carrier flow than the aluminum wire in the above-mentioned oral method. For example, the flow of 25mm2 copper wire can be calculated according to 25 mm2 aluminum wire.

Tips

● Electrician advanced information package:Wiring diagram, electrical identification, e-book, PPT …

If Michael Jackson is not a cylinder, what will be like 50 years old? Artificial intelligence tells you

Michael Joseph Jackson can absolutely be called a symbol of a era in the history of music. His music and dance have affected generations.

Perhaps he is too talented, its life has spent the dispute, among which the skin color and appearance are the largest. Even after many years of death, some people still assume that if he does not "bleach" skin and cosmetic, will it be?

Michael Jackson was killed in the King of Samway, Klin, 1992.

Below, you will look at a group of photos, look at his life, in each period. It is worth noting that the last photo is calculated by artificial intelligence, if he does not have a skin, it looks at 50.

In 1965, Jackson Jackson was on the stage for the first time and started the legendary life.

In 1978, Michael and met the music producer Quincy Jones, two people became a boring friend.

This is 1980, and he created a photo of the famous music "treasurer".

In 1983, Michael performs "space step" on the stage, shocked the world.

In 1988, Michael and Wang Hao Dianna met, creating MTV "Moonwalker", becoming the best-selling video belt in history.

In 1991, Jackson debuted in Africa, being crowned as "Sani King". At this time his skin has become white, and it has become a turning point for a lifetime.

In 1996, he divorced with a daughter of the Cat.

In 2005, after a year of forensics, "Love Book Case" finally reported that 14 accused of him were not guilty.

In 2009, 50-year-old Michael died in the United States.

If he doesn’t have a cylinder, what will he look like when he is 50 years old? Here’s this photo is artificially intelligent to give an answer.

When do you like it? Welcome to the message below.

Flying AI edge calculation terminal FCU3001 is coming! NVIDIA Jetson Xavier NX Design

If you are developing project development of artificial intelligence edge, then NVIDIA’s Jetson Xavier NX platform is absolutely ideal. As a Jetson series, Jetson Xavier NX has been favored by the majority of engineers with high-cost power and cost-effectiveness of up to 21tops.

Although NVIDIA has launched the Jetson Xavier NX system module, it is still a challenge to design a stable terminal product on the basis of some artificial intelligent R & D teams that lack hardware development experience. At this point, a mature and stable hardware device has undoubtedly brought great help to users who focus on algorithms and applications. Flying Embedded AI edge computing terminal FCU 3001 came into being.

Freon embedded AI edge computing terminal FCU3001 is an artificial intelligent edge computing device equipped with NVIDIA Jetson Xavier NX, with 6-core 64-bit ARM architecture processor, with 384 Volta core and 48 Tensor cores, calculations Force up to 21TOPS, configure 8GBLPDDR4 memory and 16GbemMC storage, is ideal for high performance computing and artificial intelligence in embedded and edge systems.

The FCU3001 created by Flying Mature Hardware Design Experience will help users easily realize the batch of computing applications of artificial intelligence.

The FCU 3001 is compact, with only 178 * 110 * 55mm, which is convenient to install or embed the equipment chassis. Excellent industrial design achieves stable no-fan cooling under the premise of ensuring the firmness and durability, ensuring that the product is stably operated at 21TOPS full load force.

The FCU3001 provides a wealth of functional development, including 4xethernet, 2XUSB3.0, 2XUSB 2.0, which is convenient for access to various sensors and peripherals, such as image capture, etc. At the same time, HDMI display is also supported, and the RS485, CAN industrial bus, one-stop control of visual identification + device linkage. It can expand storage devices such as installation of TF cards, SSD hard drives, so that data storage is not limited. Support dual-band WiFi and 4G / 5G communication, more flexible with cloud communication, allowing "5G + AI" to empower industry.

Ethernet, USB, RS485, CAN, etc. on the FCU 3001, all of the ESD4 level protection capability, contact discharge ± 8kV, air discharge ± 15kV, can meet most of the application scenario requirements for electrostatic protection, allowing equipment operation and more stable reliable.

The FCU3001 provides enriched development materials and development tools, including CUDA, CUDNN, TENSORT, and optimizes the package, so that users can download and use.

(Some information show)

Freon fully considers the user’s product-based maintenance, and the FCU3001 provides users with a U disk (Windows) update operating system, in addition to supporting the NVIDIA original OTG (need to use LinuxPC) Boot logo modify tool and operation guidance to meet user customization needs.

As an artificial intelligent edge computing device that can be applied to a variety of industries, the various artificial intelligent edge computing algorithms and procedures developed by the FCU 3001 are enabled, and the "magic" can be inspired, and the user will help users open technology in the relevant field. Robot, AGV, intelligent road conditions analysis, visual inspection, unmanned driving, smart medical, smart factory, smart city, more FCU3001 strong application, waiting for you to unlock!

I put the essence of Python coroutine Pa was clean!

This article is a large amount of information, from IO multiplexing, to use the generator, then async, await realization of the principle behind it, in simple terms, the analysis was very thorough, very hardcore!

Two days for personal reasons because it did not touch a long time to write a point of Python, which involves "coroutine" program, the last time out, it is Web framework tornado unique feature, now we have async, await keyword support . Thought about its implementation, reviews the evolution of these years, feel a little bit mean.

They are single-threaded, why the original code with the low efficiency of the async, await add some asynchronous library becomes higher efficiency?

They are single-threaded, why the original code with the low efficiency of the async, await add some asynchronous library becomes higher efficiency?

If you do Python-based network or Web development, this question has puzzled, this article attempts to give an answer.

Before beginning 0x00

Firstly, Not take you browse the source codeAnd then tell you the control to achieve the original code Python standard. Instead, we will set out from the real problems, think of solutions to the problem, step by step evolution path experience solutions, and most importantly, hoping to gain knowledge in a systematic upgrade process.

This article only provides an independent direction of thinking, does not follow the historical and current actual implementation details.

Secondly, you need to read this article familiar with Python, at least understand the concept generator generator of Python.

0x01 IO multiplexing

This is the key to performance. But we are here only to explain the concept, its implementation details is not the point, which we understand Python coroutine enough, as already know enough about, advances to 0x02.

First, you want to know all the network service program is a huge loop, your business logic can be called at some point in this cycle:

defhandler (request):

WHILETRUE:

# Get a new request

request=accept

# To get users to write business logic function according to the route map

Handler=GET_HANDLER (Request)

Handler (Request)

Imagine your Web service of a handler, after receiving a request requires a response to the results of API calls.

For the most traditional network applications, your API requests issued to wait for a response after this time the program stops running, even new requests have to get in after the end of the response. If you rely on an API request packet loss seriously, especially in response to slow it? That will be very low throughput applications.

Many traditional Web server using multi-threading technology to solve this problem: the run handler is placed on other threads, each dealing with a request, this does not affect the new thread blocks request to enter. This problem can be solved to some extent, but for larger systems concurrent, multithreaded scheduling will bring significant performance overhead.

IO multiplexing can be done to solve the problem without the use of threads, it is provided by the operating system kernel functions, we can say specifically for this type of scenario for us. Simply put, your program encounters network IO, tells the operating system to help you staring at, while the operating system gives you a way to make you can feel free to get what IO operation has been completed. like this:

# # 操作 系统 复 复 示 示 例 代代

# Register the ID and type of IO operations to the operating system IO

IO_REGISTER (IO_ID, IO_TYPE)

# Get completed IO operations

Events=IO_GET_FINISHED

For (IO_ID, IO_TYPE) INEvents:

IFIO_TYPE==Read:

Data=read_data (IO_ID)

Elifio_Type==Write:

Write_data (IO_ID, DATA)

Gring the IO multiplex logic into our server, probably like this:

Call_backs={}

Defhandler (REQ):

# do jobs here

DefCall_back (Result):

# Use the returned Result to complete the remaining work …

Call_backs [IO_ID]=CALL_BACK

# New cycle

WHILETRUE:

# Get the completed IO event

IFIO_TYPE==Read: # read

Data=read (IO_ID)

Call_back=call_backs [io_id]

Call_back (data)

Else:

# Other types of IO event processing

PASS

# Get a new request

Handler (Request)

Our Handler has returned immediately for the IO operation. At the same time, each iteration will perform a callback over the completed IO, the network request no longer blocks the entire server.

The pseudo code above is only for understanding, and the details are more complicated. Moreover, it is also possible to connect the new request to the IO event from the operating system to the monitor port.

If we split the cycle part with a call_backs dictionary to a separate module, we can get an EventLoop, which is the iOLOOP provided in the Python Standard Library Asynci.

0x02 with generator to eliminate Callback

He focuses on the Handler function written in our business, after having independent iOLOOP, it now becomes like this:

# 业 业 代 代 … …

# Need an API request

Print (Result)

ask_LOOP.GET_EVENT_LOOP.IO_CALL (API, CALL_BACK)

Here, performance problems have been resolved: We no longer need multi-threads to constantly accept new requests in the source, and don’t have to rely on the API response.

But we have also introduced a new problem. The original business logic code is now demolished. The code before requesting the API is still normal. The code after the request API can only be written in the callback function.

Here our business logic has only one API call. If there are multiple APIs, plus the call to Redis or MySQL (their essential is also a network request), the entire logic will be split, this is a burden on business development .

For some languages ??with anonymous functions (right is Java), it may also trigger a so-called "turning hell".

Next, we find way to solve this problem.

We can easily think that if the function can be suspended after running to the network IO operation, it will wake up at the breakpoint after completion.

If you are familiar with Python’s "Builder", you should find that it happens to have this feature:

Defexample:

Value=yield2

Print ("Get", Value)

ReturnValue

g=esample

# 启 启 生器, we will get 2

Got=G.send (NONE)

Print (got) # 2

TRY:

# Anti-start will display "get 4", which is our incoming value

Got=g.send (got * 2)

ExceptStopItemization ASE:

# Builder runs, will print (4), E.Value is the value of generator return

Print (E.Value)

There is Yield keyword in the function, and the call function will get a generator, and a key method for generator can interact with the generator.

G.send (none) runs the generator code until you encounter Yield, and return to the object, that is, 2, the generator code is stopped here until we perform G.send (got * 2) again, The 2 * 2 is also 4 to assign the value Value in front of Yield, and then continue to run the generator code.

Yield is like a door, you can send a thing from here, you can also take another thing.

If Send makes the generator to run until the next yield is over, the Send call will trigger a special exception STOPITERATION, which comes with a property Value, which is the value of the generator Return.

If we convert our Handler to a generator with Yield keyword, run it to The specific content of IO operationReturns, put the IO result back and restore the generator to run, then solve the problem of uncomfortable business code:

# 业 业 代 代 … …

# Need to execute an API request, directly put the IO request information yield

Result=yieldio_info

# Use the result returned by the API to complete the remaining work

Print (Result)

# This function is registered in iOLOOP, used to call back when there is a new request

Defon_Request (request):

Handler=GET_HANDLER (Request)

g=Handler (Request)

# 首 首 启 获得 获得 i 获得

IO_INFO=G.send (none)

g.send (Result)

ask_LOOP.GET_EVENT_LOOP.IO_CALL (IO_INFO, CALL_BACK)

The above example, the Handler code written by the user will not be dispersed into the callback, and the ON_Request function interacts with Callback and IOLOOP, but it will be implemented in the web framework, which is not visible to the user.

The above code is enough to give us inspiration of Callback destroyed with the builder, but there are two points:

  1. Only a network IO is initiated in business logic, but it is often more

  2. Business logic does not call other asynchronous functions (helping), but in practice, we tend to call other levels.

Let’s take a more complex example:

Among them, Request executes real IO, FUNC1, FUNC2 is only called. Obviously our code can only be written:

Deffunc1:

Ret=yieldfunc2 (re)

returnret

Deffunc2 (DATA):

ReturnResult

DEFREQUEST (URL):

# This simulation returns an IO operation, contains all information about the IO operation, where the string is simplified

Result=yield "IOJOB OF% S"% URL

ReturnResult

For Request, we expose the IO operation to the framework through Yield.

for Func1 and func2, calling request, clearly add Yield keywords Otherwise, the request call returns a generator and will not be paused and continue to perform subsequent logic obviously errors.

This is basically that we don’t write asynchronous code in the Tornado framework without Yield from, Aysnc, AWAIT.

To run the entire calling stack, the approximate process is as follows:

  1. Call FUNC1 to get the generator

  2. Call Send (None) Start it gets the result of request ("http://test.com/foo"), or generator object

  3. Send (none) Starts the generator generated by the request, gets the IO operation, registered by the frame to IOLOOP and specify a callback

  4. The Request Builder wakes up in the callback function after IO, and the generator will go to the return statement end

  5. Capture an exception to get the return value of the Request Builder, wake up the last layer of FUNC1, and get a FUNC2 generator

  6. Continue to execute …

Call FUNC1 to get the generator

Call Send (None) Start it gets the result of request ("http://test.com/foo"), or generator object

Send (none) Starts the generator generated by the request, gets the IO operation, registered by the frame to IOLOOP and specify a callback

The Request Builder wakes up in the callback function after IO, and the generator will go to the return statement end

Capture an exception to get the return value of the Request Builder, wake up the last layer of FUNC1, and get a FUNC2 generator

Continue to execute …

Friends who are familiar with the algorithm and data structure encounter such a traversal logic that will be returned, can be recursively used, because the recursive use generator can not do it, we can use the stack, in fact, this is the word "call stack" origin.

With the stack, we can Connect all generators connected in series in the entire call chain to a generatorFor its constant Send, you can continue to get all IO operation information and drive the call chain advancement, and the implementation method is as follows:

  1. The first generator is in the stack

  2. Call the Send, if you get the generator, you will enter the next round iteration

  3. I encountered IO to ask Yield, let the frame sign up to iOLOOP

  4. After the IO operation is completed, the cache result is forth, enter the next round iteration, the purpose is to restore the upper function using IO results.

  5. If a generator is running, you also need to restore the upper function to the upper function.

The first generator is in the stack

Call the Send, if you get the generator, you will enter the next round iteration

I encountered IO to ask Yield, let the frame sign up to iOLOOP

After the IO operation is completed, the cache result is forth, enter the next round iteration, the purpose is to restore the upper function using IO results.

If a generator is running, you also need to restore the upper function to the upper function.

If implemented, the code is not long but the amount of information is relatively large.

It turns the entire call chain to a generator, calling the send, to complete the IO in the chain, complete these IO, continue to push the logic execution in the calling chain until the overall logic ends:

DEFWrapper (GEN):

# The first layer calls the stack

Stack=stack

Stack.push (gen)

# Start a layer-by-layer call

WHILETRUE:

# Get the top elements of the stack

item=stack.peak

Result=none

IFisgenerator (item):

TRY:

# Try to get the next layer call and get it in the stack

Child=item.send (Result)

Stack.push (child)

# Result Restore to NONE

Result=none

# After entering the stack, enter the next loop directly, continue to explore down

Continue

# If you have an end, you will temporarily save the Result, the next step to make yourself out.

Result=E.Value

Else: # o o operation

# # I 操作 操作, Yield, Io will be woken up and temporarily saved after IO

Result=yieldItem

# 走 到 here, this layer has been completed, out of the stack, the next iteration will be a layer of calling chain

Stack.pop

# 没有有 上, the entire call chain is completed, return

Ifstack.empty:

Print ("finished")

ReturnResult

This may be the most complicated part. If you look hard, it is actually as long as you understand that for the call chain in the example above, it can achieve the effect as follows:

W=Wrapper (Func1)

# Will get "IOJOB of http://test.com/foo"

W.send (none)

# 上 上 ojob foo completed the result "bar" incompart, continue to run, get "IOJOB OF http://test.com/bar"

W.send ("bar")

# 上 上 i i b 完成 完成 传 传 传 传 入 入 入 入 入 入 入 入 入 入 入 入 入

W.send ("BARZ")

With this part, the frame will be added to the matching code:

# Maintain a list of ready lists, store all completed IO events, format is (Wrapper, Result)

Ready=

# After using the wrapper package, you can process IO by Send.

g=wrapper (func1)

# Take the start state directly as the result of NONE

Ready.Append ((g, none))

# Let the iOLOOP perform this function each cycle to handle the ready for IO

Ready.Append ((g, result))

# Traversing all already generators, advance it down

Forg, Result InselF.Ready:

# Use the Result to wake the builder and get the next IO operation

IO_JOB=G.send (Result)

# After the IO operation is complete, add the generator to the ready list, wait for the next round of processing.

ask_LOOP.GET_EVENT_LOOP.IO_CALL (

IO_JOB, LambdareSult: Ready.Append ((g, result)

Here, the core idea is to maintain a list of ready-to-read, and IOLOOP is overwhelmed, and the generator that promotes the ready state is run down, and the new IO operation is registered. After the IO is completed, the ready, after several rounds of Ioloop iteration A Handler will eventually be executed.

At this point, we use the generator to write to write business logic to run normally.

0x04 Improved Scalability

If you can read it here, Python’s scope is basically clear.

We have already achieved one Miniature sweeping frameworkThe realization details of the standard library look great here, but the specific ideas are consistent.

Our equilation framework has a restriction, we can only use IO to operate asynchronously, although in the world of network programming and web programming, the block is basically only IO operation, but there are some exceptions, such as I want the current operation Sleep for a few seconds. The use of time.sleep will make the entire thread to block, requiring special implementation. For example, some CPU-intensive operations can be asynchronously through multi-threaded asynchronous, so that another thread notification event has been completed and followed.

Therefore, it is best to decouple an open space with the network, so that the network IO is only one of the scenes, improves the scalability.

The Python official solution is to let the user hand to block the block code. As for the IOLOOP to register IO event or open a thread completely by yourself, and provide a standard "placeholder" FUTURE, indicating that his results wait for the future Yes, some prototypes are as follows:

ClassFuture:

# Set the result

Defset_Result (Result): Pass

# 获取 结果 结果

Defresult: Pass

# 表示 表示 This Future object is not already set up.

Defdone: Pass

# Set the callback function that should be executed when he is set, you can set multiple

Defadd_done_callback (Callback): Pass

Our slight change can support Future, making the scalability stronger. Network request functions for user code:

# 现在 r es es,, 生 生 器 器 器 器 器 器 器 器

#future is understood as a placeholder

Fut=future

Defcallback (Result):

# Assign the placeholder when the network IO completed the callback

Fut.set_Result (Result)

ask_LOOP.GET_EVENT_LOOP.IO_CALL (URL, CALLBACK)

Now, Request is no longer a generator, but directly returns Future.

And for the function of processing the ready list in the frame:

DEFCALLBACK (FUT):

#future is set to be placed in the ready list

Ready.Append ((g, fut.result))

Fut=g.send (Result)

Fut.add_done_callback (callback)

0x05 development and change

Many years ago, when using Tornado, probably only one Yield keyword is available, the sweeper wants to achieve, that is, this idea, even Yield keywords and return keywords can not appear in a function, you want to run after the generator Returns a value, you need to manually Raise an exception, although the effect is the same as Return now, but it is still very awkward, not elegant.

Later, there was Yield from expression. What can it do?

It is popular, it is done what the generator Wrapper is doing the above: Calling link through the stack, it is the syntax of the Wrapper logic.

With it, the same example you can write:

Deffunc1:

# Note Yield from

Ret=yieldFromRequest ("http://test.com/foo")

# Note Yield from

Ret=yieldfromfunc2 (re)

returnret

Deffunc2 (DATA):

# Note Yield from

Result=yieldfromRequest ("http://test.com/"+data)

ReturnResult

# 同 上 上 实 实 实 实 实 r

Then you no longer need the brainless Wrapper function:

g=func1

# Return the first request for Future

g.send (none)

# Continue to run, automatically enter FUNC2 and get the FUTURE inside it

G.send ("bar")

# Continue to run, complete the residual logic of the call chain, throw the stopiteration exception

G.send ("BARZ")

Yield from the entire call chain directly, it is already great, but it is used asynchronous programming or otherwise, and other languages ??have special-top Async, the AWAIT keyword, until the later version puts these content With dedicated Async, AWAIT keyword packaging, it is a more elegant look today.

0x06 summary and comparison

Overall, Python’s native and trip is achieved from two aspects:

  1. Based on IO multiplexing technology, the entire application is non-blocking on IO, achieving high efficiency

  2. Change the dispersed Callback code through the generator into synchronous code, reducing business writing difficulties

Based on IO multiplexing technology, the entire application is non-blocking on IO, achieving high efficiency

Change the dispersed Callback code through the generator into synchronous code, reducing business writing difficulties

There is a language of the object of the generator. Its IO fight is achieved, the evolution of the Java fight is basically exactly, the keyword is the same, and the Future class is the same than the promise.

However, it is different for this, which is different from this sweeping with the degree of GO-named GO, and does not explicitly based on the generator.

If the class ratio, you can implement the geventime of Python, which is the runtime, and Patch off the system calls to access your own Runtime, you come to the scheduling sweeper, gevent is focused on the network, based on network IO scheduling, relatively simple, The GO achieves perfect multi-core support, more complex and perfect, and creates a new CHANNEL new programming paradigm.

Author: Mao bean peanut

Getting Started: The Most Complete Zero-Basic Python Problem | Zero-Based 8 Months Python | Battle Project | Learning Python is this shortcut

Dry goods: crawling Douban short comment, movie "later we" | 38 years old NBA best player analysis | From Wanzhong to Word! Tang Dynasty 3 disappointment | Laughing to see the new Eti Dragon Slay Dollar | Running Question King | Make a massive Miss in Python Sketch | Disc, I am so fire, I use machine to learn to be a mini recommended system movie

Fun: Poultry Game | Nine Mao Hai | Beautiful Flower | Two-Article Python "Everyday Cool" game!

AI: Robot that will be poetry | Give the picture color | predictive income | Solver, I use the machine to learn to be a mini recommended system movie

Gadget: PDF to Word, easy to get forms and watermarks! | One button saves the HTML page as PDF! Goodbye PDF to extract charges! Use 90 lines of code to create the strongest PDF converter, Word, PPT, Excel, Markdown, HTML one-to-date conversion | Make a staple low-cost ticket prompt! | 60 lines of code made a voice wallpaper switch every day to see a little sister! |

Annual explosion case

  • 1). Lying! PDF to Word Use Python to easily get it!
  • 2) Learn Python is really fragrant! I made a website with 100 lines of code, helping people PS travel pictures, earn a chicken leg to eat
  • 3). The first broadcast over 100 million, hot all net, I analyzed the "Sister Taking Wind and Waves" and found these secrets
  • 4) 80 lines of code! Do a Dream in Python with Python
  • 5). You must master the 20 Python code, short and delicate, useless
  • 6). 30 python hambo skills
  • 7). I summarized 80 "rookie Python selection dry goods.pdf", all dry goods
  • 8). Goodbye Python! I want to learn Go! 2500 word depth analysis!
  • 9). Find a dog welfare! This Python reptile artifact is too cool, automatically download the girl picture