Placeholder Image

字幕列表 影片播放

  • so right.

  • Worker threats, Crash course.

  • All right, let's see.

  • Is this work the way I want it to?

  • A kind of does.

  • Um, yeah.

  • So I'm kind of stuck with the title because I chose it, But it's real.

  • This is really more like an introduction to the things I like.

  • Slash use slash.

  • Want to talk about work or threats or perhaps even more accurately.

  • I was doing a thing, and I wanted to talk about the thing and the end of talking about worker thread so that I could stand up and talk about the thing.

  • Um, so I talk fast.

  • I usually say, I will try not to, and I will fail and I'm sorry, but I have 25 minutes and, like 40 billion slides, So talking fast is by superpower Right now.

  • I know it's not very Hawaii to talk really fast, but doing the best I can.

  • Anyway.

  • My name is Rich and I work for the universe of California San Francisco campus in the Library B and then include I'm including myself in this.

  • We all act like the Internet didn't exist until Amazon and pets dot com came along.

  • But government institutions, including public universities like Universal California were there for decades working on hard problems like Effin Ethernet.

  • How does it work?

  • One of the jazz concert Why organizers had a block post about the role of the University of Hawaii in Ah, and that sort of stuff.

  • And you should read it because it's really fascinating.

  • Anyway, As you might imagine, the UCSF Library does not have an extraordinary large Deverell budget.

  • Um, don't beloved several positions.

  • There's not a lot of money around me to travel to tropical locales to attend conferences and talk about JavaScript.

  • So for making it possible for people like me and, perhaps more importantly, people who are not like me in several respects to be on the stage of this conference.

  • Mad props to the Jazz, Conway Organizer's and the sponsors.

  • Uh, so I am the composed of a rock opera.

  • This would normally be by fun fact, by the way, but since it was part of my talk, I I held it back.

  • I'm the capos of a rock opera about a steakhouse and includes dancers and steak suits and things like that.

  • Uh um, it sounds, I hope this works.

  • It sounds something like this.

  • Okay, it's gonna hang on.

  • Wait.

  • It's really, really groovy.

  • So anyway, um, but, uh, we're gonna That's actually the good thing to fail, because didn't actually come here.

  • Thio play excerpts from from a rock opera.

  • I just bring it up because I put most of most of the like I put a link to the slides and the link to all the things I talk about in here.

  • Uh, palace family steakhouse dot com.

  • Um, so now the only reason I get to stand up here and play except for my rock operas because I work on note, by the way, who runs knowed Everybody does.

  • If you if you don't think you did, you run note, right?

  • Okay, so if you're using this, it doesn't matter.

  • I only talk five minutes.

  • Um, um uh, if you're running noted, you're running a lot of code that I wrote on a 2013 Mac book.

  • Just pointed out.

  • So So, um, so, uh, me And like, 200 other 2 2000 other people.

  • But anyway, so it's a quick disclaimers.

  • The views expressed my own.

  • Not so Those in my employer.

  • That's a standard disclaimer.

  • Also, the views expressed on my own and not necessarily those of no did.

  • There are a lot of other people involved in note, and naturally, I want to see everything the same way.

  • Just two days ago, was decided to remove a handful of deprecate id AP eyes from the code base that I think we should just leave in there.

  • So clearly my opinions are not those of note necessarily.

  • But I wasn't nearly as angry as this person was about it anyway, with out of the way back to note.

  • Hey, have you heard about worker threats?

  • Um, they were introduced in no 10.5 dot zero, but it required a command line flag to using that version.

  • So in No.

  • 12 you don't need a command line flag, and you really want to use 12 11 or newer because that's the first version where worker threads were determined to be stable rather than experimental.

  • And really, you want to use 12 15 0 because that's the version that was released like a day or two ago that fixes some security issues.

  • If you like to live on the edge, use the current version that that won't be supported yet in a few months.

  • But it's No.

  • 13 80 which is the version that was released a few days ago.

  • Security fixes anyway.

  • Yeah, worker threads.

  • What are they?

  • Even so, they're kind of like Web workers, but different.

  • There's no there's no shared worker, For example.

  • Uh oh, that's there.

  • It is Okay if he was not used Web workers, don't worry, Stay with me.

  • They're also kind of like threads and other programming languages, but also not like threads and other programming languages.

  • If you use threats and other programming languages, cool.

  • If not, don't worry.

  • Stay with me, man.

  • That image takes a wild blue.

  • It's pretty big.

  • Okay, anyway, Java script is single threated, as we all know, even if you don't know what that means.

  • There's an excellent chance you've heard Java script a single threated before seeing it on this slide.

  • That's because there's one cold, hard, unchanging fact in this ever changing world in which we live in.

  • And that unquestioning fact is JavaScript is single, threaded, arguably literally arguably because, like some people like to argue about this, I don't want to have that argument, though.

  • So the point is, your code does one thing at one time.

  • Uh, it's why this program never exits.

  • There's only one execution.

  • Uh, I'm sorry.

  • That's why there's only, uh, who's on one execution threat handling this.

  • Could the code in the set time out, which would cause the wild loop to stop, never executes.

  • Right.

  • Um, it's, you know, it's just going to sit in the wild loop forever and and and the time out one fire until the wild loop exits the while.

  • It's never gonna exit.

  • So the time that never fires stuck in flew forever.

  • Classic deadlock.

  • Right.

  • So this code will run forever, or until you press control, see, or you turn off your computer or whatever.

  • But it's not gonna exit cleanly and whatever causes to exit, it's not gonna be the set time out.

  • This is called blocking the Event loop.

  • You may have heard that phrase before you heard it in Max's talk.

  • Like 20 minutes ago.

  • He recommended Sam Roberts video.

  • That's great.

  • It's great.

  • Great talk.

  • I recommend this one.

  • This is ah, What the heck is the event, Luke Anyway by Philip Roberts.

  • If you get nothing else out of this talk.

  • Let it be that you should get more than one thing out of this talk.

  • But if you could only get two things from this talk let the 2nd 1 be that you want to watch this talk, okay, that talk, not this talk.

  • Since what happens when I have to compress four hours worth of material in 25 minutes?

  • Anyway, there's a link to that talk of Palestinians taking dot com.

  • Now you may be thinking, but note is a synchronous.

  • I don't really have to worry about blocking the event.

  • Look, you're probably not thinking that, but you might be.

  • Someone might be it.

  • Can you?

  • No.

  • Can effectively do many things at once.

  • Like handle multiple simultaneous http requests or read multiple files.

  • Max was just telling about telling us about this in the last talk, and his slides were gorgeous.

  • So it must be true.

  • And it is true because Max is a good egg.

  • He would not lead you astray.

  • But the built in a synchronous nature of node has been around input output.

  • I Oh, that's why I mentioned files.

  • And that's why I mentioned TV.

  • If you're doing, say data science stuff, maybe, Or, um uh, like processing graphics, you know, image, image processing or basically, anything that CPU intensive.

  • Then let's just say that the default state of things in node and in javascript eyes not as a synchronous so prior to worker threads the usual way people would offload CPU in a non blocking way.

  • In note was the cluster module.

  • And if that's working for you, great.

  • But here's the thing.

  • Cluster spreads your workout workload out across multiple processes, and each of those processes has independent memory and so on.

  • So I make sharing large amounts of data problematic, and each process consumes the full amount of RAM required.

  • Bye note.

  • So this could be really inefficient again, though, if it's working for you, great.

  • But if it doesn't work for you, if it doesn't work for a lot of things, and even if it is working, worker threats will often work out better.

  • And here's why.

  • Worker threats are my weight, not a whole process.

  • It's just a thread, Um, and they're better at sharing data, which will talk about briefly and then I'll do some hand waving stuff until you go look at the documentation.

  • Um, so let's dive in.

  • Uh, here's a hello world example on.

  • Let's just go through it step by step.

  • The first line pulls in three things from the worker threads module.

  • It pulls in the er year starting from the right hand side.

  • Suppose in apparent porter pulls in the main red Julian and it also pulls in the worker class And, um, yeah, so is made thread at the parent port.

  • So we use is made thread thio to make sure we are We're not using.

  • We're not inside a worker threat already.

  • Basically, we're checking, you know, we're checking that we're not aware of threats so that we know that's okay to launch a worker threat.

  • If we didn't do that, we might be in a worker threat that launches a worker threat that launches a worker threat that launches work threat and just working threats all the way down until you're run out of, I don't know, stack heap something, some kind of ramp.

  • Um, when you're in some kind of resource, uh, this check is usually only necessary if you have your worker thread code and your main threat code in the same file.

  • I don't usually like to do that, but for a hello world example, it seemed convenient to just have one blob of code and not like.

  • Here's the word.

  • So that's what it is.

  • Is main threat.

  • Cool anyway, eso we're in the main threat.

  • So what we're gonna do is create a worker threat.

  • So we use the constructor for the worker class, and that's what that new worker is all about.

  • Right?

  • New is the key word for Instructor's job script, and we pass it under bar under our file name, which is the special no Jets variable that says, uh, you know the file, the path to the file that contains the code currently being executed.

  • If you didn't know that, that was what that was.

  • Now you do.

  • You can create a worker threat to run any job script spot while you specify.

  • But like I said here, we're just keeping it 15 You can also pass it a string that and and tell it that this is a blob of code to execute.

  • I don't like to do that because that's basically Val, and, you know, we've all been taught that Val is, you know?

  • Yeah.

  • God kills a kid or something like that when you fell.

  • You know, um, you and so you know, like to avoid it, But, um Anyway, uh, so we've created a worker.

  • Um, And now it's Listen for messages from the worker.

  • Uh, this is the usual event listener, syntax and note.

  • Remember, we're in the main threat.

  • Still not the worker threat.

  • We're listening for messages, message events on the worker we've created.

  • And when we get one, we're gonna use Consul Log to print the message.

  • Okay, so that's it for the main threat.

  • That's all we're doing now, remember, we were in an f block that checked if we were in the main thread.

  • So now let's use the else block and do the right stuff for when we're in the worker threats.

  • And all we're gonna do is use parent port to send a message to the main threat in the main threat.

  • Parent port will be No.

  • But, uh, you know.

  • So if you want to send a message to the worker from the parent point, we use the port.

  • The post message method that's on the worker.

  • Instance we'll see that later.

  • Sorry, I'm talking so fast, but in a word with red parent port, that post message.

  • Like we see, they're used to send messages to the main threat.

  • So let's use it to send a message that says Hello World.

  • And that's the end of file.

  • You'll remember them.

  • The main thread.

  • We set up a listener that would take the message and print it out.

  • So this is the convoluted way to console Log Hello World.

  • Not terribly useful.

  • There are much easier ways to do that, of course, but it doesn't you just the very basic concepts of worker threats.

  • And now let's do something equally contrived but more interesting.

  • And I'll try to slow down a little six degrees of Kevin Bacon.

  • Perhaps you remember the game.

  • Uh, if not, it's simple, given the name of an actor in the film your job is to.

  • That's a cool effect.

  • Your job, should you choose to accept it, is to connect to them to Kevin Bacon in six or fewer steps in the following manner.

  • Let's say your challenge to connect Katy Perry to Kevin Bacon.

  • I don't think this is gonna get old in six or fewer steps.

  • Uh, Katy Perry words Katy Perry wasn't Zoo Lander to with John Malkovich, and John Malkovich was in Queens Logic with Kevin Bacon Boom, Katy Perry to Kevin Bacon and Two Steps.

  • I've seen neither of those films.

  • Um, anyway, there are already websites that solve six degrees of Kevin Bacon by using IMDB data Several years ago, I wanted to do this for musicians playing on recordings of individual songs, so I made a site called Music Roots, and it's been broken for a long time because some one who I want say, what who was but removed in a P I that I was dependent on.

  • And then everybody, they're fixing it anyway.

  • It's been brewing for a long time, so let's fix it So First.

  • Surprisingly, there is no usable database available on what musicians play on what tracks on what recordings.

  • And some people say, What about all music?

  • They only have information.

  • Who played on what album not track by track information.

  • Other people ask me about music brains.

  • They only have artists associate with tracks, not individual musicians.

  • So middle class about discards.

  • They have published album credits, but Sometimes the credits don't list track by track data, and often they are wrong, even intentionally.

  • So asked me for examples after the talk, because I love talking about this sort of stuff, but otherwise, just know that disguise data correctly reflectors on an album sleeve, which does not correctly reflect what is in reality all the time.

  • That brings us to a wicky data, which has some data all along these lines, but way less than you think.

  • That's cool, though.

  • It's wicky data so everyone can add data to it.

  • But it's very, very unusable.

  • E slow for the many, many, many queries that would be required to do this.

  • So I built my own database and published it.

  • It's very incomplete, but it will do here.

  • Uh, I also built a rudimentary little visualize er for it, and we'll see that in a bit.

  • Uh, so Okay, in order to solve these things, we could use breath first search, and many of you, maybe most of you, maybe all of you, I don't know may already know what breath for searches.

  • But just in case, I am now going to give the world's worst overview of breath for a search.

  • Let's go back to connected.

  • Katy Perry to Kevin Bacon.

  • Step one is Katy Perry.

  • Kevin Bacon.

  • That's a job triple equal there in the middle.

  • The answer is obviously no Step two.

  • Find everyone that was in a movie with Katy Perry.

  • Do any of those people having to be Kevin Bacon?

  • And the answer is still no Step three.

  • Find everyone that was in the movie with any of those people that were in a movie with Katy Perry.

  • Do any of those people have any Kevin Bacon as you saw before with the Katy Perry John Malkovich Kevin Bacon thing?

  • The answer is yes.

  • So we're done.

  • Congratulations.

  • You just what is the worst explanation?

  • Breath for a search ever.

  • But we're not done.

  • Let's do a slightly better explanation.

  • This will be a second worst explanation.

  • Breath for a search ever were game going to connect Katy Perry, Kevin Bacon?

  • But this time not to movies.

  • This time, let's do it through music.

  • Kevin Bacon has a band with his brother, Michael Bacon, and the band is called the Bacon Brothers.

  • I am not making that up, so let's see if we can connect Katy Perry to Kevin Bacon via music.

  • Step one is Katy Perry.

  • Kevin Bacon?

  • No.

  • Uh, So here's a visualization of Katy Perry and everyone she recorded with on her album.

  • One of the boys, which I'm sorry to say, is the only album of hers they have in the data set.

  • You can open a poor request to fix that if you want to correct that massive injustice.

  • But anyway, Kenny Perry's a circle in the middle, and each circle of the surrounding ring is someone who is one step away from Katy Perry because they recorded with her on their album, notably absent in that Ring of people, Kevin Bacon.

  • Now imagine we take each of the circles in the ring around Katy Perry, and we find out everyone who recorded with each of those people we take all those people and make an outer ring with circles for each of those people.

  • Now, I didn't do that, but I did scrawl this blue run line around things to show where the outer ring of circles would be and the number of circles the number of circles in that ring is going to grow exponentially or at least exponentially ish.

  • It's gonna grow very, very quickly.

  • Part of why I didn't do it, Um, so you don't want to see all the surface anyway, But I'm here to tell you something exciting about that outer ring it totally as Kevin Bacon in it, and that's basically breath for a search.

  • Now we can take a look at the results instructor path.

  • So here's what path looks like.

  • If you don't believe me, it's Katy Perry.

  • Toe gave Stewart, Dave Stewart, Jon Bon Jovi, Kevin Bacon.

  • Okay, so that's breath for a search.

  • Now let's implement it.

  • No, no, just kidding.

  • Rivers of this presentation.

  • It's an implementation detail, and there are tradeoffs in various ways to implement it that we don't really have time to go into.

  • You can check out the report, this depository for how I implemented it, a cz well as to other algorithms.

  • We'll talk about it a bit, but the important thing is that our approach will keep the CPU busy rather than do a bunch of work up front.

  • This is so that we can see how co worker threats are, but it's also a legitimate trade off.

  • One might make in the real world, it's not always worth it to spend a bunch of time up front three processing if it's too time consuming or takes too many too much storage, or if there's too much unpredictability about what you're gonna get, etcetera.

  • So here's what it looks like.

  • Let's step through this.

  • Okay, The first line gets all the tracks for the start person.

  • Let's say it's Aretha Franklin and puts all those tracks at the element at index zero.

  • That's Index zero in the array of tracks for the Star person.

  • Now the index indicates how many steps we've gone from the start individual.

  • So, um, this next line populates the corresponding array of individuals that are that are the source of the tracks above again an Index zero.

  • In this case, it's an array of just one individual knee, namely Aretha Franklin.

  • Uh, for the two lines starting here, we're going to do the exact same thing for the target person.

  • Let's say it's Carrie Brownstein.

  • This line checks to see if we have a match by seeing if there is one of war tracks that are in both lists of tracks.

  • Lastly, this wild, who runs until we find a match.

  • So this lion ads all the individuals and tracks that result from going out one more step from the start individual than we've gone this far.

  • So all the people on tracks with Aretha Franklin.

  • Then the next time it runs, it's all the people on tracks with removing people, trading, etc.

  • Outer blue line, um, and so on and so forth.

  • And this line updates matches, um, list.

  • So the wild loop will stop if we found a match each time through the last wild loop, like I said, grows exponentially ish, gets slower and slower and slower with longer and longer paths.

  • So here's a run with the results.

  • It took more than 14 seconds just to do the breath first search.

  • That's that's a lot we can do better.

  • Even without work or threats, we could do bi directional search.

  • Uh, so, uh, bye, Drexel.

  • Search.

  • Right.

  • Okay.

  • Now, at this point, you may be feeling a bit like the You know, this dog you might be thinking when he's going to shut up about this stuff and go back to work or threats soon.

  • Don't worry.

  • So the first bi directional search.

  • Here's how it works.

  • First, Katy Perry is not Kevin Bacon, despite striking resembles Second, we look for everyone that connected Katy Perry and check to see if Kevin Bacon is in there.

  • He is not, uh Now we do something different.

  • We bounce back to Kevin Bacon and we get everyone connected to him.

  • We check to see if there's an overlap, and again there isn't.

  • And then we do once we Okay, so right.

  • Obviously.

  • Believe this slide.

  • That's okay, though.

  • Um, eh.

  • So we do have a bacon and so on so forth until they share a person and it's gonna look like this.

  • So here's your preferred search.

  • That over on the left is Katy Perry.

  • That over on the right is Kevin Bacon.

  • They're not the same person.

  • There's all the field play with Katy Perry.

  • Okay?

  • They're not Kevin Bacon.

  • There's all the people that played with with with the people who play with Katy Perry.

  • Still no Kevin Bacon.

  • Okay, that was brought.

  • First search.

  • We found Kevin Bacon.

  • Now let's do it with bi directional search.

  • Okay.

  • One subway for Katy Perry.

  • Oh, look, Kevin Bacon and that.

  • Well, that wasn't an expensive search because we're not going to the outer circles yet.

  • Look, we all have to do one expensive search.

  • We're gonna see a lot better performance before we get a match.

  • Okay, Um, don't believe me about by direction search or I've gone too fast.

  • Hey, there's a Wikipedia article and even talks about big O notation proved that it's faster and better and, well, that's her stuff.

  • Here's what bidirectional search looks like.

  • Implemented, um, and we're just gonna look at the wild loop because that's where all the that's world, the interesting changes.

  • Basically, instead of doing just the one side the start side, we're going to start side and the target side and holy moly.

  • We went from over 14 seconds.

  • Less than three seconds.

  • That's awesome.

  • That's probably good enough, actually, just called it today.

  • But wait.

  • Why be bound by a single thread rather than doing one breath first search from Katy Perry and then waiting for it to finish and then checking against Kevin Bacon and waiting for that to finish and then bouncing back Katy Perry when I just sort of just let him both run and give you data as fast as they can.

  • And every time you get data from one check to see if you can stop, stop oh, threads and go from there and see how fast that is.

  • So to crave are working threats.

  • This time we're calling new Worker again, and this time we're putting the worker code in a file called Worker Js.

  • So we'll see that in the moment.

  • There's also a new thing over here in the second argument, which is a worker data property.

  • This allows us to provide the idea of the individual t.

  • To start with this serialize is the data and send it to the worker, which then un serialize is it into its own copy of the data now?

  • Worker threat.

  • So that's kind of just like passing, you know, basically, you're more or less Jason data over, and then you know it.

  • Uncivilized.

  • Is that Jason Day?

  • That's not exactly Jason.

  • Data can handle circular references and things like that, but working threats could do this awesome, magical thing where if you do things just right, you can share memory and also transfer memory buffers between the main threat and the worker threat.

  • Sharing memory doesn't actually resemble sharing nachos.

  • But I needed an image Anyway, we're doing this in the app working.

  • We're not doing this in the APP.

  • Working data just sends a copy.

  • But if your data is of a predictable size and for Matt and there's a lot of it, look at the docks for information sharing and transferring data, it's really cool.

  • In addition to the share memory stuff, there's pooling for this application.

  • Well, we always need to workers, and we don't care about the cost of starting them up only when we need them.

  • But in an application.

  • Where were your needs are more dynamic?

  • You're trying to get the absolute best performance you can.

  • You'll want to investigate having a pool of workers that you use is needed and their MPM modules to help you do that if you need to.

  • Anyway, over in the worker, we're reading the worker data values done like this.

  • We import the work of data property from the built in worker threads module, and then we read the value of the idea context, switching back to the main red.

  • We have an error, listeners simply three throws and unexpected errors, and we call a call back that we use when we received a message from the worker.

  • The index here is used to distinguish the results in Katy Perry's group from results in Kevin Bacon's group.

  • We might use zero for Katy Perry and one for Kevin Bacon.

  • Let's head over to the worker code again to see how the worker sends a message.

  • So when the workers created it grabs all the tracks the individuals on and also makes a note of the individual i D.

  • And uses post message to send the message.

  • And that's it.

  • That will cause the message event to be admitted in the main thread resulting in execution of the callback.

  • So let's check out with the callback.

  • Does again.

  • The index is a value that lets us know if we're dealing with Katy Perry or Kevin Bacon isn't start or the target.

  • We also get all the individuals for whom the track is derived.

  • Tracks are derived, brother, and we check to see if there are any tracks that are on both lists, thus indicating they're expanding.

  • Circles are overlapping.

  • If we have a match we call a function called done, we'll check that out in a moment.

  • And if we're not done, we send a message to the worker to go get us another expanding ring of tracks.

  • Individuals not gonna show the worker code that listens for the message is pretty similar to what we've already seen.

  • It gets a string value.

  • Next, it gets the next set of search results and sends them back to the main threat.

  • This is way too much for 25 minutes.

  • But just know that to receive the message, the workers listen to the message event on the parent port object.

  • So I do want to talk about that done function really quickly, though it removes the listener we have for both workers.

  • And then it calls this mess that that's on the worker called Terminal Terminate Does it ends the worker threat and returns a promise that results in return code of the worker could, uh, if we have cleanup code or whatever we want, make sure it runs.

  • We can put in a sink function and await the value rather than just calling terminate like we're doing here.

  • But in this case, you know, we don't have any clean up.

  • I don't care.

  • It connects it with an area code.

  • I just wanted to go away, so to do that.

  • And lastly, we print our results.

  • So let's see how it performs.

  • Remember it Took 14 seconds with breath.

  • First search.

  • It took just under three seconds with bi directional search.

  • Oh my gosh.

  • It's less than 700 milliseconds now.

  • I can't believe it.

  • It's unbelievable.

  • By the way, all of these, uh, scripts are in the repository posted earlier showed earlier.

  • And that's Ah comlink.

  • Anyway.

  • Now, with my 53 seconds remaining, I have to admit that the main motivation here wasn't really talk about worker threats.

  • Awesome as they are, it was to find out how far I was from little mass x.

  • The answer, By the way, it's six degrees.

  • It starts with little mass X.

  • He, of course, you know, recorded with Billy Ray Cyrus on, you know, have him come on the Old Town road.

  • Second degree is country star Mary Chapin Carpenter, who, along with Billy Ray Cyrus was on the Dolly Parton song called Romeo Dolly.

  • Parton gets her own slide thing after mention Romeo was 30 Seconds studio album.

  • She wrote it.

  • She produced the record.

  • People who aren't country fans don't realize the extent to which is in control of her sounding a career.

  • I'm not a country fan, but I recognize that she is a legend and a force to be reckoned with.

  • Do not mess with Dolly and also, you know, since we're talking about a whole town wrote.

  • But the analogous legend and force to be reckoned with a node is on ahead.

  • Nixon.

  • She's the one most responsible for implementing worker threads, and as far as all things note go is extremely difficult to give on the too much credit.

  • So I'm I'm up here talking about worker threads, but like she did 99.999% of the hard work get this done, and the other 0.1% was aren't me anyway, back to this nonsense after Dolly Parton's track, Mary Chapin Carpenter goes through Saturday Live band leader G.

  • Smith and Tom Waits trumpet player before getting to me.

  • But why should I restrict fund van the exercises like this to me?

  • I put this up in a glitch.

  • You are l which is you know, works, eh?

  • So if you want to, you know, try to connect.

  • No, I mean, it's just great, but I mean, you know, it's like, uh, you know, like, you can just also get the repository and just run the express app on your local machine will be faster.

  • Uh, this is also my lovely, but you could go over here and try to, you know, see if you can connect.

  • You know?

  • I don't know.

  • Miles Davis, too.

  • Billy Ray Cyrus?

  • Um, yeah.

  • Like I said, everything's a Palestinian state house dot com.

  • Thanks.

  • I'm out of time and, uh yeah, thank you.

  • Sorry.

  • Also, I like this.

so right.

字幕與單字

單字即點即查 點擊單字可以查詢單字解釋

B1 中級

工人螺紋速成班 - Rich Trott | 夏威夷JSConf 2020 (A Crash Course on Worker Threads - Rich Trott | JSConf Hawaii 2020)

  • 2 0
    林宜悉 發佈於 2021 年 01 月 14 日
影片單字